用正则表达式计算群体问​​题

时间:2011-11-16 19:14:17

标签: java regex

编辑:原始代码中的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();
        }

    }

}

1 个答案:

答案 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();
}