【问题标题】:Match a string to multiple regex patterns and return the group number将字符串匹配到多个正则表达式模式并返回组号
【发布时间】:2019-07-15 14:00:49
【问题描述】:

我正在使用 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。

谁能帮我解决这个问题? 非常感谢。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    我测试了你的正则表达式,看起来不错。也许您的正则表达式中需要其他函数或标志? 我做的截图here

    Regex

    Matches

    Groups

    【讨论】:

    • 感谢您的回复,您测试getGroup() 方法了吗?它返回值了吗?我的问题是它没有返回组值,而是返回 `null`。
    • @pietà ,对不起,但我没有。目前我没有java并且只使用了java regex引擎的在线版本。它显示捕获的第 4 组,值为 6
    【解决方案2】:

    感谢所有花时间阅读并与我一起思考以寻求解决方案的人。 希望我找到了解决方案。最后,如果单词与模式匹配,我将模式和测试分开。 (可能在使用迭代器|时会出现混淆)

    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;
    }
    

    【讨论】:

      【解决方案3】:

      TD91160152 的值与您的正则表达式的第二部分匹配,但该组是您的总正则表达式中的第 4 组。所以你需要使用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
      

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 2013-11-04
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 2012-03-11
        相关资源
        最近更新 更多