将字符串匹配到多个正则表达式模式并返回组号

Posted

技术标签:

【中文标题】将字符串匹配到多个正则表达式模式并返回组号【英文标题】: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。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于将字符串匹配到多个正则表达式模式并返回组号的主要内容,如果未能解决你的问题,请参考以下文章

perl正则表达式

正则表达式

re模块正则表达式

正则表达式

Java正则表达式入门

Java正则表达式基础学习