模式java找出OR匹配的部分

时间:2013-06-26 19:42:33

标签: java regex pattern-matching

我有以下模式:

Pattern TAG = Pattern.compile("(<[\\w]+]>)|(</[\\w]+]>)");

请注意|在模式中。

我有一个用这种模式进行处理的方法

private String format(String s){
    Matcher m = TAG.matcher(s);
    StringBuffer sb = new StringBuffer();

    while(m.find()){
        //This is where I need to find out what part
        //of | (or) matched in the pattern
        // to perform additional processing


    }
    return sb.toString();
}

我想根据OR匹配的部分执行不同的功能 正则表达式。我知道我可以将模式分解为两种不同的模式并匹配每种模式,但这不是我正在寻找的解决方案,因为我的实际正则表达式要复杂得多,如果我能做的话,我想要完成的功能最有效它在一个循环中和正则表达式。所以我的问题是:

在java中是否有办法找出正则表达式中匹配的OR的哪一部分?

修改 我也知道m.group()功能。它对我的情况不起作用。以下示例 打印出<TAG></TAG>因此,对于循环的第一次迭代,它在<[\\w]+>上匹配 和第二次迭代它在</[\\w]+>上匹配。但是我需要知道每次迭代匹配哪个部分。

static Pattern u = Pattern.compile("<[\\w]+>|</[\\w]+>");

public static void main(String[] args) {
String xml = "<TAG>044453</TAG>";

Matcher m = u.matcher(xml);

while (m.find()) {
    System.out.println(m.group(0));
}
}

3 个答案:

答案 0 :(得分:1)

查看Matcher上的group()方法,您可以执行以下操作:

if (m.group(1) != null) {
    // The first grouped parenthesized section matched
}
else if (m.group(2) != null) {
    // The second grouped parenthesized section matched
}

编辑:恢复到原始组号 - 不需要额外的数据。这应该使用如下模式:

static Pattern TAG = Pattern.compile("(<[\\w]+>)|(</[\\w]+>)");

答案 1 :(得分:0)

你应该通过分解公共部分来重写你的模式:

xy|xz  => x(y|z)
xy|x   => xy?
yx|x   => y?x

然后,通过将诸如y?之类的有趣部分放在括号中,您可以使用group()检查它是否已设置。

答案 2 :(得分:0)

您不必将[]\\w一起使用,因为它已经是一个类。你也可以用括号括起OR的每个选项,然后将它们作为组使用(如果找不到其中一个组,它将具有空引用)。所以你的代码看起来像这样:

static Pattern u = Pattern.compile("(<\\w+>)|(</\\w+>)");

public static void main(String[] args) {
    String xml = "<TAG>044453</TAG>";

    Matcher m = u.matcher(xml);

    while (m.find()) {
        if (m.group(1)!=null){// <- group 1 (<\\w+>)
            System.out.println("I found <...> tag: "+m.group(0));
        }else{ // if it wasn't (<\\w+>) then it means it had to be (</\\w+>) that was mathced 
            System.out.println("I found </...> tag: "+m.group(0));
        }
    }
}

您还可以将模式稍微更改为<(/?)\\w+>,使/部分可选并将其放在括号中(在这种情况下将使其成为第1组)。这样,如果tag没有/,那么group 1将只包含空字符串"",因此您可以将逻辑更改为

        if ("".equals(m.group(1))) {// 
            System.out.println("I found <...> tag: " + m.group(0));
        } else { 
            System.out.println("I found </...> tag: " + m.group(0));
        }