正则表达式捕获组具有可选的分隔符

时间:2011-03-31 02:53:49

标签: java regex lookahead capturing-group

看起来像一个简单的问题,我需要提取一个捕获组,并可选择使用分隔字符串限制该组。

在下面的例子中,我提供了一个'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

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

2 个答案:

答案 0 :(得分:4)

试试这个:

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

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

答案 1 :(得分:0)

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