编辑:原始代码中的RE无关紧要(或者说没有任何意义)。假设你匹配(X)|(Y)
:在RE中与OR组合的两种模式。如何知道哪个模式实际匹配?
我正在尝试仅提取在括号内的RE 的文本。
我面临的问题是我无法弄清楚哪个实际组匹配,因为群组索引由于OR而不是常量。
即标有XXX m.group()
的行返回整个模式
pat1
abcdef2
m.group(1)
生成
pat
null
m.group(2)
生成
null
de
m.groupCount()
只是RE中的一组总数,所以它对索引没用。
我想要打印的循环是
pat
de
遗憾的是java没有perl的m /运算符,它会提取所有内容并将其很好地放入数组中;-)
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) throws IOException {
Pattern p = Pattern.compile("([pat]+)1|abc([de]+)f2");
String original = " pat1 abcdef2555";
Matcher m = p.matcher(original);
boolean result = m.find();
while (result) {
System.out.println(m.group()); // XXX want to print only matched GROUP!!
result = m.find();
}
}
}
答案 0 :(得分:1)
我没有看到Java直接支持这一点。
(Perl确实有一个漂亮的语法,你可以使用(?|([pat]+)1|abc([de]+)f2)
,两个组都有相同的数字,显然没有问题,因为只有一个或另一个。 )
所以给你答案
我想要打印的循环是
轻拍
德
你必须自己检查该组是否可用,所以这个循环会给你所需的输出:
while (result) {
if (m.group(1)!= null) System.out.println(m.group(1));
if (m.group(2)!= null) System.out.println(m.group(2));
result = m.find();
}