[size=large]

package cn.mingyuan.regexp.singlecharacter;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class GroupIndexAndStartEndIndexTest {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str = “Hello,World! in Java.”;

Pattern pattern = Pattern.compile(“W(or)(ld!)”);

Matcher matcher = pattern.matcher(str);

while(matcher.find()){

System.out.println(“Group 0:”+matcher.group(0));//得到第0组——找到W然后整个匹配其所在字符串,不是整个str

System.out.println(“Group 1:”+matcher.group(1));//得到第一组匹配——与(or)匹配的

System.out.println(“Group 2:”+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式

System.out.println(“Start 0:”+matcher.start(0)+” End 0:”+matcher.end(0));//总匹配的索引

System.out.println(“Start 1:”+matcher.start(1)+” End 1:”+matcher.end(1));//第一组匹配的索引

System.out.println(“Start 2:”+matcher.start(2)+” End 2:”+matcher.end(2));//第二组匹配的索引

System.out.println(str.substring(matcher.start(0),matcher.end(1)));//从总匹配开始索引到第1组匹配的结束索引之间子串——Wor

}

}

}

程序的运行结果为:

Group 0:World!

Group 1:or

Group 2:ld!

Start 0:6 End 0:12

Start 1:7 End 1:9

Start 2:9 End 2:12

Wor

总结:其实group(),start(),end()所带的参数i就是正则表达式中的子表达式索引(第几个子表达式),由于刚开始对Java正则表达式中的组的概念不清晰,导致理解困难。当将“组”的概念与“子表达式”对应起来之后,理解matcher的group,start,end就完全没有障碍了。

group 0是获取匹配的整个字符串

group 1是第一个括号匹配的字符串, 2是第二个括号匹配的字符串 …..以此类推

[/size]


版权声明:本文为miao_miu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/miao_miu/article/details/84860438