java 正则表达式 matcher.find()与group(i)

yanlimin9 2009-01-05 12:54:28
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
...全文
7950 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbd0315 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

0 表示整个匹配表达式的字符串

接下来的数字是,从左开始数捕获组的左括号,第几个左括号就是第几组。
捕获组是以 ( 开头,后面不是 ? 的组,比如:(a) 就是一个捕获组,而 (?:a) 就不是捕获组。

举例说明:

a(b(c(d)))e

从括号数可以看出,一共有 3 组。

第 0 组:abcde
第 1 组:bcd
第 2 组:cd
第 3 组:d

按照你说的“捕获组是以 ( 开头,后面不是 ? 的组,比如:(a) 就是一个捕获组,而 (?:a) 就不是捕获组。”,那么零宽断言也不是捕获组了,对吗?
zbd0315 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

0 表示整个匹配表达式的字符串

接下来的数字是,从左开始数捕获组的左括号,第几个左括号就是第几组。
捕获组是以 ( 开头,后面不是 ? 的组,比如:(a) 就是一个捕获组,而 (?:a) 就不是捕获组。

举例说明:

a(b(c(d)))e

从括号数可以看出,一共有 3 组。

第 0 组:abcde
第 1 组:bcd
第 2 组:cd
第 3 组:d

捕获(组)是什么概念啊
HZC565835435 2011-08-18
  • 打赏
  • 举报
回复
很好 学习了
yanlimin9 2009-01-05
  • 打赏
  • 举报
回复
没有回复啊,自己顶
terryzero 2009-01-05
  • 打赏
  • 举报
回复
这个问题我专门写了个博客
你可以去看看
http://blog.csdn.net/terryzero/archive/2009/01/05/3716115.aspx
正则表达式还是很强大的
  • 打赏
  • 举报
回复
0 表示整个匹配表达式的字符串

接下来的数字是,从左开始数捕获组的左括号,第几个左括号就是第几组。
捕获组是以 ( 开头,后面不是 ? 的组,比如:(a) 就是一个捕获组,而 (?:a) 就不是捕获组。

举例说明:

a(b(c(d)))e

从括号数可以看出,一共有 3 组。

第 0 组:abcde
第 1 组:bcd
第 2 组:cd
第 3 组:d
nsdcomputer 2009-01-05
  • 打赏
  • 举报
回复
group是用来存放正则表达式的匹配结果的,就是一个变量,其中的内容是匹配结果!
举例:
  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) );
}
}

执行第一次m.find()时,
group(0)在匹配过程中存放的字符串是 "\u1234",
而group(1)在匹配过程中存放的字符串是"1234"

执行第二次m.find()时,
group(0)在匹配过程中存放的字符串是 "\u34fa",
而group(1)在匹配过程中存放的字符串是"34fa"

具体的分组概念,自己找资料,在我的正则表达式中,就是用“()”围起来的部分,也就是group(1),
默认情况下,group(0) 或者 group() 匹配整个正则表达式
yanlimin9 2009-01-05
  • 打赏
  • 举报
回复
明白了,原来group跟find没有关系阿(虽然只能是find或matches后才能得到groups)
cqmarlin 2009-01-05
  • 打赏
  • 举报
回复
name.txt 匹配的是(.+)
^.+\\\\(.+)$" ,这个表达式Group结果有两个,第一个是自己,後面的话有几个()就有几个结果,但注意结果是最后符合(.+)的那个。
^.+\\\\相当于c:\dir1\dir2\
(.+)就匹配上了name.txt。

JDK上有详细说明。
fuyou001 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 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.…
[/Quote]
注意regex 后面
yanlimin9 2009-01-05
  • 打赏
  • 举报
回复
还是没人回答,为什么???

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧