【问题标题】:Regular Expression capturing group with optional delimiter带有可选分隔符的正则表达式捕获组
【发布时间】:2011-07-26 13:48:37
【问题描述】:

这似乎是一个简单的问题,我需要提取一个捕获组,并选择使用定界字符串限制该组。

在下面的示例中,我提供了一个分隔字符串“cd”,并希望它在所有情况下都返回“ab”:“ab”、“abcd”和“abcdefg”

代码如下:

public static void main(String[] args) {
    String expected = "ab"; // Could be more or less than two characters
    String[] tests = {"ab", "abcd", "abcdefg"};
    Pattern pattern = Pattern.compile("(.*)cd?.*");

    for(String test : tests) {
        Matcher match = pattern.matcher(test);
        if(match.matches()) {
            if(expected.equals(match.group(1)))
                System.out.println("Capture Group for test: " + test + " - " + match.group(1));
            else System.err.println("Expected " + expected + " but captured " + match.group(1));
        } else System.err.println("No match for " + test);
    }
}

输出是:


    No match for ab
    Capture Group for test: abcd - ab
    Capture Group for test: abcdefg - ab

我认为前瞻可能有效,但我认为没有一个是可选的(即零个或多个实例)

【问题讨论】:

  • 问题是,即使您使第一个 (.*) 不贪婪,正则表达式中的其他所有内容 - (?:cd).* - 都是可选的,因此捕获组将消耗整个字符串并且会有一场比赛。您需要使正则表达式更具体。此外,您可以使用 this web page,而不是为每个测试运行 Java 程序。
  • 我不确定如何根据要求使正则表达式更具体...预期字符串的长度可以是一个或多个字符,否则长度限制器会起作用,但其他除此之外,我不知道还有什么限制。
  • 不能只用indexOfsubstring吗?
  • 你明白我的意思吗?从您的正则表达式的角度来看,没有办法区分您要匹配的部分、可选的分隔符和字符串的其余部分。
  • @Melv - 这是一个更大的组匹配器的一部分,所以 indexOfsubstring 不是选项

标签: java regex lookahead capturing-group


【解决方案1】:

我认为您唯一的问题可能是? 仅适用于d。请改用(cd)?

【讨论】:

  • 输出:abcdabcdefg 失败
【解决方案2】:

试试这个:

Pattern pattern = Pattern.compile("(.*?)(?:cd.*|$)");

.*? 是非贪婪的,正则表达式的其余部分要么匹配 cd 后跟任何内容,要么匹配字符串的结尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2018-08-15
    • 2012-11-20
    • 2017-07-27
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多