Java分裂正则表达式非贪婪匹配不起作用

时间:2013-08-16 20:06:55

标签: java regex non-greedy

为什么非贪婪的比赛不适合我?举几个例子:

public String nonGreedy(){
   String str2 = "abc|s:0:\"gef\";s:2:\"ced\"";
   return str2.split(":.*?ced")[0];
}

在我看来,结果应该是:abc|s:0:\"gef\";s:2但它是:abc|s

2 个答案:

答案 0 :(得分:2)

正则表达式中的.*?匹配除\n以外的任何字符(0次或更多次,匹配的可能性最小)。

您可以尝试使用正则表达式:

:[^:]*?ced

另一方面,您应该使用常量Pattern来避免每次重新编译表达式,例如:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile(":[^:]*?ced");

public static void main(String[] args) {
    String input = "abc|s:0:\"gef\";s:2:\"ced\"";
    System.out.println(java.util.Arrays.toString(
        REGEX_PATTERN.split(input)
    )); // prints "[abc|s:0:"gef";s:2, "]"
}

答案 1 :(得分:1)

表现如预期。非贪婪的匹配将尽可能少地匹配,并且对于您的输入,要匹配的最小字符是下一个ced的第一个冒号。

您可以尝试限制消耗的字符数。例如,将术语限制为“最多3个字符:

:.{0,3}ced

要使其尽可能接近ced,请使用此正则表达式进行否定预测:

:(?!.*:.*ced).*ced

这可确保ced没有更接近的冒号。

相关问题