Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java split regex非贪婪匹配不起作用_Java_Regex_Non Greedy - Fatal编程技术网

Java split regex非贪婪匹配不起作用

Java split regex非贪婪匹配不起作用,java,regex,non-greedy,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正则表达式中的*?匹配除\n之外的任何字符(0次或更多次,匹配尽可能少的数量) 您可以尝试使用正则表达式: :[^:]*?ced 另一方面,应使用常量模

为什么非贪婪的比赛不适合我?例如:

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

正则表达式中的
*?
匹配除
\n
之外的任何字符(0次或更多次,匹配尽可能少的数量)

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

:[^:]*?ced
另一方面,应使用常量模式避免每次重新编译表达式,例如:

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, "]"
}

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

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

:.{0,3}ced

要使其尽可能靠近
ced
,请使用负前瞻,并使用以下正则表达式:

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

这样可以确保没有一个更靠近
ced

“的冒号。*?在正则表达式macth中,除\n(0或更多次(匹配尽可能少的数量))之外的任何字符。“为什么不应该匹配
:*?ced
ced?”我现在理解了@Bohemian的答案和您的链接。该算法首先搜索“:”,然后尝试查找“.”的最小匹配项。我以为它看到了这两个步骤。因此,
:[^:][*?ced
是解决这个问题的完美方案。谢谢如果你告诉我的是真的,那么我想,
:.*ced
应该会成功。但它的作用完全相同。为什么?您的解决方案对我没有帮助,因为:和ced之间的字符可以超过3个。我想要的是最小的匹配,我想这是非贪婪的,但关键是它从第一个冒号开始就匹配了。所以你需要最短的冒号匹配,然后是ced。我想我可以帮你:)看编辑后的答案!我不明白。非常感谢。你的解决方案也很好。但是你对
:[^:][*?ced
说什么呢?这不也是可能的吗?