0

我发现java中的拆分正则表达式很贪婪

String str = ";;;";
System.out.println(str.split(";").length);

输出 - 0(错误)

预期 - 4

String str = ";;;a";
System.out.println(str.split(";").length);

输出 - 4

我尝试修改正则表达式并使用正则表达式使其变得懒惰,;+?但输出为 0。

任何想法如何使正则表达式在此处拆分为贪婪将不胜感激。

提前致谢

4

5 回答 5

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根据需要打印。

查看文档以获取更多详细信息。

于 2013-05-09T07:09:30.710 回答
1

文档

此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

让它变得贪婪:

limit 参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则该模式将最多应用 n - 1 次,数组的长度将不大于 n,并且数组的最后一个条目将包含最后一个匹配分隔符之外的所有输入。如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以有任意长度,并且尾随的空字符串将被丢弃。

于 2013-05-09T07:14:14.267 回答
0

尝试

 String str = ";;;"; 
 System.out.println(str.split(";",-1).length); //LIMIT missed 
于 2013-05-09T07:13:04.760 回答
0

这与贪婪无关。它与 split() 实现有关。

默认情况下,所有尾随空白匹配都将被忽略。由于您只有空白匹配项,因此所有匹配项都将被丢弃。

要覆盖忽略尾随空格的这种行为,请使用第二个参数调用 split -1;

str.split(";", -1);

第二个参数n限制,javadoc 说:

如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以有任意长度,并且尾随的空字符串将被丢弃。

有关更多详细信息,请参阅javadoc 。split()

于 2013-05-09T07:26:05.463 回答
0

String.split(String s) API 表示尾随的空字符串不包含在结果数组中。如果您希望将它们包括在内,请尝试无限限制

    String str = ";;;";
    System.out.println(str.split(";", Integer.MAX_VALUE).length);
于 2013-05-09T07:30:46.603 回答