我试图理解捕获括号是如何为正则表达式工作的,但是我没有得到它......
我的代码是:
Pattern pattern = Pattern.compile("ab"); Matcher m = pattern.matcher("abc"); while (m.find()) { for (int i = 0; i < m.groupCount(); i++) { System.out.println(m.group(i)); } }
所以我根本没有显示器。 我的理解是我需要一个捕捉括号来记住匹配的结果并显示它。
所以我做了:
Pattern pattern = Pattern.compile("(ab)"); Matcher m = pattern.matcher("abc");
我有预期的显示:ab
然后我想记住并只显示匹配结果的一部分,所以我做了:
Pattern pattern = Pattern.compile("(a)b"); Matcher m = pattern.matcher("abc");
我原本期待:a,但我有:ab
为什么?
答案 0 :(得分:3)
来自Matcher#group()
的javadoc:
捕获组从左到右编制索引,从一个开始。组零表示整个模式,因此表达式m.group(0)等同于m.group()。
问题是组零(即m.group(0)
)匹配整个模式,而不是捕获括号内的模式。因此,为了匹配您想要的组,您需要从索引1开始并结束直到组计数:
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
在您的情况下,您只有一个组。但如果你有类似Pattern.compile("(a)(b)")
的内容,则(a)
会匹配第1组,而(b)
会匹配第2组。