我试图了解捕获括号如何为正则表达式工作,但我不明白...
我的代码是:
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
为什么?
最佳答案
来自 Matcher#group()
的 javadocs :
Capturing groups are indexed from left to right, starting at one. Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to 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 组。
关于java - 正则表达式和捕获括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27070032/