日期:2014-05-20  浏览次数:20786 次

java 正则表达式 matcher.find()与group(i)
find()以后的group(0)是字符串自己,但是以后的呢是找符合正则表达式的子串么?
例如下面一段程序:
String regEx="^.+\\\\(.+)$";

String str="c:\\dir1\\dir2\\name.txt";

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.matches();

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

System.out.println(m.group(i));

}
为什么输出的是下面的阿:
c:\dir1\dir2\name.txt
name.txt
我的意思是name.txt又不符合表达式regEx

------解决方案--------------------
引用楼主 yanlimin9 的帖子:
find()以后的group(0)是字符串自己,但是以后的呢是找符合正则表达式的子串么?
例如下面一段程序:
String regEx="^.+\\\\(.+)$"; //你有(.+)分组了,当然会回来,改成(?:.+)只分组,不捕获

String str="c:\\dir1\\dir2\\name.txt";

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.matches();

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

System.out.println(m.group(i));

}
为什么输出的是下面的阿:
c:\dir1\dir2\name.…

------解决方案--------------------
name.txt 匹配的是(.+)
^.+\\\\(.+)$" ,这个表达式Group结果有两个,第一个是自己,後面的话有几个()就有几个结果,但注意结果是最后符合(.+)的那个。
^.+\\\\相当于c:\dir1\dir2\
(.+)就匹配上了name.txt。

JDK上有详细说明。

------解决方案--------------------
group是用来存放正则表达式的匹配结果的,就是一个变量,其中的内容是匹配结果!
举例:
Java code
  public static void main(String[] args) {
      String input = "\\\\u1234\\\\u34fa";
    String regex = "\\\\u([0-9a-f]{4})";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    while (m.find()) {
        System.out.println(m.group() + "   " + m.group(1) );
    }
    }