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
说什么呢?这不也是可能的吗?