我发现java中的split regex是贪婪的
String str = ";;;";
System.out.println(str.split(";").length);
输出 - 0(错误)
预计 - 4
String str = ";;;a";
System.out.println(str.split(";").length);
输出 - 4
我尝试修改正则表达式并使用正则表达式将其设为惰性;+?
,但输出为0。
任何想法如何使正则表达式贪婪分裂在这里将非常感激。
提前致谢
答案 0 :(得分:2)
您需要指定限制,以达到您想要的效果。
str.split(";", -1); // -1 is the limit, which will make the split method greedy as you want.
非正限制表示该模式将被应用尽可能多次!
因此,System.out.println(str.split(";").length);
现在将根据需要打印4
。
请查看docs以获取更详细的信息。
答案 1 :(得分:1)
来自Doc。
此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。 结尾的空字符串因此不包含在结果数组中。
limit参数控制模式的应用次数,因此会影响结果数组的长度。如果限制n大于零,那么模式将最多应用n - 1次,数组的长度将不大于n,并且数组的最后一个条目将包含除最后一个匹配分隔符之外的所有输入。如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。
答案 2 :(得分:0)
尝试
String str = ";;;";
System.out.println(str.split(";",-1).length); //LIMIT missed
答案 3 :(得分:0)
与贪婪毫无关系。它与split()实现有关。
默认情况下,将忽略所有尾随空白匹配项。由于您只有空白匹配,所有匹配都将被丢弃。
要覆盖忽略尾随空白的这种行为,请使用第二个参数-1
调用split;
str.split(";", -1);
第二个参数n
是限制,javadoc说:
如果n是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。
请参阅javadoc for split()
更多详细信息。
答案 4 :(得分:0)
String.split(String s)API表示结尾数组中不包含尾随空字符串。如果您希望将它们包括在内,请尝试使用无限制
String str = ";;;";
System.out.println(str.split(";", Integer.MAX_VALUE).length);