之前我们看了下正则的基本语法规则以及简单的正则创建和匹配写法。这里我们就重点关注下具体的匹配对象提供的一些方法,基本都过一遍,然后我们针对邮箱、电话等做一些练习(过程中不会的我们再回过头的复习一下)

一、Matcher 类的方法(pattern负责将匹配规则进行编译,然后匹配获得的对象为matcher,之后的操作都是通过Matcher提供)

1. 索引方法

索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

序号方法及说明

1public int start()

返回以前匹配的初始索引。

2public int start(int group)

返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引

3public int end()

返回最后匹配字符之后的偏移量。

4public int end(int group)

返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。

开始实践之前了,我们先看一个组的概念:

捕获组

捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

((A)(B(C)))

(A)

(B(C))

(C)

可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。

直接看实例比较好理解:

String patterns = "(ru)noob(.ppx)";

1. ()可以作为分组标识,比如上面的匹配规则中(ru)、(.ppx)分别为一个组

2. 其中组的顺序是从1开始,而0表示的是整个字串

需要find()到才能获取哟!!!!

///< 组的概念

String patternzu = "(ru)noob(.ppx)";

Pattern patternzzu = Pattern.compile(patternzu);

String contentzu = "from runoob.com. runoob. I am noob.ppx runoob.ppx I am noob";

Matcher matcherzu = patternzzu.matcher(contentzu);

System.out.println("匹配组个数: " + matcherzu.groupCount());

if (matcherzu.find()){

for (int i = 0; i <= matcherzu.groupCount(); ++i){

System.out.println("组(0表示整个字串): " + matcherzu.group(i));

}

}

结果:

匹配组个数: 2

组(0表示整个字串): runoob.ppx

组(0表示整个字串): ru

组(0表示整个字串): .ppx

其实还是蛮好理解的对吧!就是匹配规则利用()号进行了分组,有什么好处了?

比如我们匹配的规则很多,其中我们需要某个组的位置,用于精确找到要匹配的字串的索引,有什么用呢? ---- 最简单的就是替换

比如(img)sb_picture(.png), 我们需要找到所有的imgsb_picture.png,然后替换.png为.jpg,这个时候你通过public int start(int group)和public int end(int group)就可以获取对应的起始终止位置,进而实现准确的替换!!!

因为1. 你首先准确的找到了imgsb_picture.png

2. 进而又准确的替换掉了.png

现在我们再来看这个具体的方法案例就轻松些了

///< @1 回顾下基础用法

String content = "I am noob " +

"from runoob.com. runoob. I am noob.ppx runoob.ppx I am noob";

System.out.println("字符串长度=" + content.length());

String patterns = "(ru)noob(.ppx)";

boolean isMatch = Pattern.matches(patterns, content);

System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);

///< @2 回顾下基础用法

Pattern pattern = Pattern.compile(patterns);

Matcher matcher = pattern.matcher(content);

System.out.println("字符串中是否包含了 'runoob' 子字符串? " + matcher.find());

///< matcher.find()相当于next的概念,所以用完后需要重新开始记得重置!

matcher.reset();

System.out.println("匹配组: " + matcher.groupCount());

if (matcher.find()){

System.out.println("全部串: " + matcher.group(0));

System.out.println("子串: " + matcher.group(1));

System.out.println("子串: " + matcher.group(2));

System.out.println("找到子串起始位置: " + matcher.start(1));

System.out.println("找到子串终止位置: " + matcher.end(1));

System.out.println("找到子串起始位置: " + matcher.start(2));

System.out.println("找到子串终止位置: " + matcher.end(2));

}

看结果:

匹配组: 2

全部串: runoob.ppx

子串: ru

子串: .ppx

找到子串起始位置: 50

找到子串终止位置: 52

找到子串起始位置: 56

找到子串终止位置: 60

就是这样呀呀呀!

2. 研究方法

研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

序号方法及说明

1public boolean lookingAt()

尝试将从区域开头开始的输入序列与该模式匹配。

2public boolean find()

尝试查找与该模式匹配的输入序列的下一个子序列。

3public boolean find(int start)

重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。

4public boolean matches()

尝试将整个区域与模式匹配。

然后我们看案例吧,,,比较直接

find() - 就是类似next的用法,不停找下一个

find(int start) - 跳过一些位置开始找

matches() - 整个完全匹配是否成功的标识

lookingAt() - 需要从第一个字符开始就匹配

matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。

lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。

这两个方法经常在输入字符串的开始使用。

看案例

///< 研究方法

Pattern patternb = Pattern.compile("abc");

Matcher matcherb = patternb.matcher("abc");

while (matcherb.find()){

System.out.println("找到子串起始位置: " + matcherb.start());

System.out.println("找到子串终止位置: " + matcherb.end());

}

System.out.println("找到子串终止位置: " + matcherb.find());

System.out.println("找到子串终止位置: " + matcherb.lookingAt());

System.out.println("找到子串终止位置: " + matcherb.matches());

结果:

找到子串起始位置: 0

找到子串终止位置: 3

找到子串终止位置: false

找到子串终止位置: true

找到子串终止位置: true

3. 替换方法

替换方法是替换输入字符串里文本的方法:

序号方法及说明

1public Matcher appendReplacement(StringBuffer sb, String replacement)

实现非终端添加和替换步骤。

2public StringBuffer appendTail(StringBuffer sb)

实现终端添加和替换步骤。

3public String replaceAll(String replacement)

替换模式与给定替换字符串相匹配的输入序列的每个子序列。

4public String replaceFirst(String replacement)

替换模式与给定替换字符串匹配的输入序列的第一个子序列。

5public static String quoteReplacement(String s)

返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。

replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

///< 替换方法

String hellabct = "abcabc";

Pattern patternbt = Pattern.compile("abc");

Matcher matcherbt = patternbt.matcher(hellabct);

System.out.println(matcherbt.replaceFirst("def"));

System.out.println(matcherbt.replaceAll("def"));

结果:

defabc

defdef

4. append相关

appendReplacement是java中替换相应字符串的一个方法

appendReplacement(StringBuffer sb,String replacement)

将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里

appendTail(StringBuffer sb)

将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里

So, 一般是配合使用,核心就是:

while(m.find()){

m.appendReplacement(sb,REPLACE);

}

m.appendTail(sb);

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches

{

private static String REGEX = "a*b";

private static String INPUT = "aabfooaabfooabfoobkkk";

private static String REPLACE = "-";

public static void main(String[] args) {

Pattern p = Pattern.compile(REGEX);

// 获取 matcher 对象

Matcher m = p.matcher(INPUT);

StringBuffer sb = new StringBuffer();

while(m.find()){

m.appendReplacement(sb,REPLACE);

}

m.appendTail(sb);

System.out.println(sb.toString());

}

}

sb就是最终我们操作完成的结果: 相当于aabfooaabfooabfoobkkk -> -foo-foo-foo- + kkk

kkk就是m.appendTail(sb)获取的...

到这里还是好理解赛。 关键还是需要去实践,看概念。

二、PatternSyntaxException 类的方法

PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。

PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。

序号方法及说明

1public String getDescription()

获取错误的描述。

2public int getIndex()

获取错误的索引。

3public String getPattern()

获取错误的正则表达式模式。

4public String getMessage()

返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。

三方没有提供一个案例,我们就看看怎样用就行:

try{

System.out.println("找到子串起始位置: " + matcherb.start());

} catch (PatternSyntaxException ex) {

System.out.println("PatternSyntaxException: " + ex.getMessage());

//ex.printStackTrace();

}

就是捕获异常嘛。。。

到这里我们就暂时把这个相关方法过了一下,以后或许会用到....下一篇尝试实践邮箱、电话案例

java的matcher方法_Java-Android-正则表达式-Matcher方法相关推荐

  1. java matcher.group_详解正则表达式Matcher类中group方法

    前言 同事把一个excel表给我,里面的数据大概有几千的样子吧.自己需要把里面的数据一个一个拿出来做一个http请求,对得到的结果进行过滤,然后再写到上面去.这是就涉及到用脚本来进行操作了,于是自己搞 ...

  2. java 特殊符号正则_java利用正则表达式处理特殊字符的方法实例

    前言 一串字符串中有特殊符号,可能会影响到相关接口业务,所以需要把字符串中的特殊字符都过滤掉 百度上面搜索大部分处理方法是通过正则表达式, 他需要处理的特殊符号都写进正则表达式中去校验, 这种方式一眼 ...

  3. Java知识回顾 (6)正则表达式、方法、文件与异常

    一.正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java 正则表达式和 Perl 的是最为相似 ...

  4. java字符串的用法_Java字符串的重要方法的使用实例

    String类将是您存储和处理语言的主要工具之一,本篇文章将带领大家对Java字符串的方法有个基础的认识,了解他的功能使用方法. 本文摘自千锋教育编著的<Java语言程序设计>,如需转载请 ...

  5. java 同类调用方法_JAVA中同类中方法的调用问题?

    1.为什么可以直接new+构造方法,来创建对象.而不用创建实例引用呢,像常见的这种:Car car1=new Car;我记得看过有说java中没有被引用的对象将被GC处理.那这个算不算. 你创建了一个 ...

  6. java一般方法有哪些方法有哪些方法_Java代码优化有哪些方法?

    Java代码优化是Java编程开发很重要的一个步骤,Java代码优化要注重细节优化,一个两个的细节的优化,产生的效果不大,但是如果处处都能注意代码优化,对代码减少体积.提高代码运行效率是有巨大帮助的, ...

  7. java tostring方法_Java虚拟机如执行方法调用的(二)?

    虚方法调用 Java里所有非私有实例方法调用都会被编译成invokevirtual指令. 接口方法调用都会被编译成invokeinterface指令.这两种指令都属于Java虚方法的调用. 在大多数情 ...

  8. java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换

    这段时间学习java的反射机制想实现一个功能:遍历一个Map,然后利用反射机制调用BO的set方法,完成BO属性的自动注入.这样设计的初衷是解决Excel数据导入问题中的Map数据填充BO这一过程. ...

  9. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  10. java 定时执行方法_Java定时执行任务 方法总结

    JAVA技巧(Java定时执行任务的实现方法)2009年02月07日 星期六 10:36定时执行任务的三种方法: 1)java.util.Timer. 2)ServletContextListener ...

最新文章

  1. 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】...
  2. 点击输入框弹出文字html,jQuery实现点击文本框弹出热门标签的提示效果
  3. Spring+Redis整合
  4. php 时间格式化_3分钟短文 | PHP获取函数的代码片段,唯有反射最高效
  5. linux 远程调试文件夹,GDB远程调试开发板程序
  6. linux命令wget下载jdk(完整解决诸多异常)
  7. 【报告分享】2021中国数字化全景图谱与创新企业研究报告:数字浪潮下的创新力量.pdf(附下载链接)...
  8. Jungle Roads//最小生成树kruskal
  9. 三个流行MySQL分支的对比
  10. 清除每隔5000毫秒请求一次接口的定时器(需求:每当我手动核销电子码,页面上的显示数据要实时更新到)...
  11. SSH 工具 PuTTY 最新官方下载地址及教程
  12. 010 editor 应用templates分析ELF和dex文件
  13. 华为软件编程规范和范例
  14. DataGrid Bind Checkbox....
  15. 实用的bi报表工具--Smartbi报表软件
  16. 前端实现GIF图片压缩上传
  17. 为什么会有口臭,如何避免?
  18. pygame学习笔记——检测鼠标碰到、点击图片
  19. c++和python哪个好_python和c++哪个好 有什么区别
  20. Python云端开发基础

热门文章

  1. Vue2.0中动态拼接图片路径
  2. 未来人类电脑U盘重新安装系统的操作方法分享
  3. elementUi中的表单全部禁用allDisabled
  4. java proguard_java混淆之proguard
  5. [LeetCode练习]976. 三角形的最大周长
  6. 配置强内容全的电视盒子,还不带广告,泰捷WEBOX 60C上手
  7. 终于有人说清楚 “幸存者偏差” 了
  8. CLR20r3错误 问题定位与解决
  9. Qt自绘汽车仪表盘-1
  10. 人工智能的基础算法总结