前面章节介绍了 Matcher 类的 matches、 lookingAt 和 find 三个方法。本章节将介绍 Matcher 位置相关的方法,如下:
使用 find() 方法将尝试查找与该模式匹配的输入序列的下一个子序列。如果 find() 方法返回 true,则说明匹配到了一个子序列。我们就可以利用 start()、end() 和 group() 三个方法获取子序列的详细信息。如下:
String group():返回由以前匹配操作(这里是 find() 方法)所匹配的输入子序列
int start():返回以前匹配子序列的初始索引
int end():返回最后匹配字符之后的偏移量
实例:使用多行模式匹配多行文本中,每行以 “t” 字符开头,“o” 字符结束,t 和 o 字符之间存在零个或一个 a~z 的字符序列。注意:字符 t 的前面必须紧跟空格,字符 o 的后面必须紧跟空格。代码如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo21 { public static void main(String[] args) { String str = "Be honest rather clever\r\n" + "Being on sea, sail; being on land, settle\r\n" + "Be just to all, but trust not all\r\n" + "Believe not all that you see nor half what you hear\r\n" + "Be slow to promise and quick to perform\r\n" + "Between two stools one falls to the ground\r\n" + "Better an open enemy than a false friend"; Pattern pattern = Pattern.compile("\\s+t[a-z]*o\\s+", Pattern.MULTILINE); Matcher matcher = pattern.matcher(str); while(matcher.find()) { System.out.println(matcher.group() + " 位置:[" + matcher.start() + ", " + matcher.end() + "]"); } } }
运行结果如下:
to 位置:[75, 79] to 位置:[163, 167] to 位置:[184, 188] two 位置:[204, 209] to 位置:[225, 229]
上面以及介绍了不带参数的 start()、end() 和 group() 方法,它们用来获取调用匹配方法后匹配到的子序列的详细信息。而带有参数的它们可以获取给定分组的详细信息,定义如下:
int groupCount():返回此匹配器模式中的捕获组数
String group(int group):返回在以前匹配操作期间由给定组捕获的输入子序列
int start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
int end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量
实例:使用多个分组语法来匹配 “Hello World” 文本,然后通过 groupCount() 来迭代出每个分组的详细信息。代码如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo22 { public static void main(String[] args) { String str = "Hello World"; Pattern pattern = Pattern.compile("((Hello)\\s(World))"); Matcher matcher = pattern.matcher(str); if(matcher.find()) { System.out.println("分组数:" + matcher.groupCount()); // 根据分组数迭代,注意:分组0永远表示主分组 for(int i = 1; i <= matcher.groupCount(); i++) { // 获取指定分组的起始位置,以及分组匹配的内容 System.out.println(matcher.group(i) + " 位置:[" + matcher.start(i) + ", " + matcher.end(i) + "]"); } } } }
运行结果如下:
分组数:3 Hello World 位置:[0, 11] Hello 位置:[0, 5] World 位置:[6, 11]