将字符串与多个正则表达式模式匹配,然后返回组号

时间:2019-07-15 14:00:49

标签: java regex

我正在使用Matcher类在Java中使用正则表达式

以下是我所拥有的描述:

我有多个用管道分隔的正则表达式。 我必须得到与其中一个正则表达式匹配的单词组。

这是pattern变量:

private static Pattern pattern = Pattern.compile(
        "^TDXF.*\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\\d+|^TD.{3}([0-9]).{4}$|^.*_.*-.*-([0-9]*)\\..*\\..*\\..*$");

,此方法用于返回与单词相关的组号。

private static String getGroup(String gp) {
    String g= "";
    if (gp== null) {
        return g;
    }

    final Matcher matcher = pattern.matcher(gp);
    if (matcher.matches()) {
 g= matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
    }
    return g;
}

我编写了一个单元测试来测试它是否适用于此字符串,例如:TD91160152,但失败了。

 @Test
public void testGroup() {
    Assert.assertEquals("6", this.getStep("TD91160152"));
    Assert.assertEquals("2", this.getStep("TDXF-tv-2.5.10.1_0.0.0.0"));
    Assert.assertEquals("6", this.getStep("TD91160118_SF11043004"));

    Assert.assertEquals("3", this.getStep("TDXF_sih-tv-3.4.12.1_7.21.3.1"));
    Assert.assertEquals("5", this.getStep("TD20_sih-tv-5.2.20.1"));
    Assert.assertEquals("5", this.getStep("TD30_sih-tv-5.15.8.1"));
}

TD91160152匹配此模式^TD.{3}([0-9]).{4}$,它应返回6作为matcher.group(1)数字:see this demo

我不知道为什么它失败并返回null作为组号。 我认为这与正则表达式之间的重叠无关。

我试图删除其他模式,只放

private static Pattern pattern = Pattern.compile(
        "^TD.{3}([0-9]).{4}$");

并且有效。.我不知道为什么当我添加另一个正则表达式时会返回null。

有人可以帮我吗? 非常感谢。

3 个答案:

答案 0 :(得分:0)

我测试了您的正则表达式,看起来不错。也许您在正则表达式中需要其他功能或标志? 我制作的here

屏幕截图

Regex

Matches

Groups

答案 1 :(得分:0)

感谢所有花时间与我一起阅读和思考的人,以寻求解决方案。 希望我找到了解决方案。最后,我将模式和单词是否与模式匹配进行了测试。 (在使用迭代器|时,可能会造成混乱)

private static Pattern p1 = Pattern.compile("^TDXF.*\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\\d+");

private static Pattern p2 = Pattern.compile("^TD.{3}([0-9]).{4}$");

private static Pattern p3 = Pattern.compile("^.*_.*-.*-([0-9]*)\\..*\\..*\\..*$");

private static String getGroup(String gp) {
    String g = "";
    if (gp== null) {
        return g;
    }

    final Matcher matcher1 = p1.matcher(gp);
    final Matcher matcher2 = p2.matcher(gp);
    final Matcher matcher3 = p3.matcher(gp);

    if (matcher1.matches()) {
        g= matcher1.group(1) != null ? matcher1.group(1) : matcher1.group(2);
    }
    if (matcher2.matches()) {
        g= matcher2.group(1) != null ? matcher2.group(1) : matcher2.group(2);
    }
    if (matcher3.matches()) {
        g= matcher3.group(1) != null ? matcher3.group(1) : matcher3.group(2);
    }
    return g;
}

答案 2 :(得分:0)

TD91160152与您的正则表达式的第二部分匹配,但该组是总正则表达式中的第四组。因此,您需要使用getGroup(4)来获取6

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ff {
    static String part1="^TDXF.*\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\\d+$";
    static String part2 = "^TD.{3}([0-9]).{4}$";
    static String part3 = "^.*_.*-.*-([0-9]*)\\..*\\..*\\..*$";
    private static Pattern pattern = Pattern.compile(part1+"|"+part2+"|"+part3);


    public static void main(String args[]) {
        Matcher m=pattern.matcher("TD98760452");
        if(m.matches())
        {
            for (int i=1;i<=m.groupCount();i++)
                System.out.println(m.group(i));
        }
    }
}

输出为

null
null
null
6
null