为什么非贪婪匹配对我不起作用?举个例子:
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
为什么非贪婪匹配对我不起作用?举个例子:
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
另一方面,您应该使用常量 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, "]"
}
它的行为符合预期。非贪婪匹配将尽可能少地匹配,并且根据您的输入,要匹配的最小字符是第一个冒号到下一个ced
。
您可以尝试限制消耗的字符数。例如,将术语限制为“最多 3 个字符:
:.{0,3}ced
要使其尽可能接近拆分ced
,请使用此正则表达式使用负前瞻:
:(?!.*:.*ced).*ced
这确保没有更接近的冒号ced
。