为什么java String.split()会留下空字符串?

时间:2015-09-24 08:29:53

标签: java regex string split

当我使用String.split()方法时,为什么有时候我会得到空字符串?例如,如果我这样做:

"(something)".split("\\W+")  

然后返回值的第一个元素将是一个空字符串。此外,文档中的示例(如here所示)也没有意义。

Regex          Result

  :    { "boo", "and", "foo" }}
  o    { "b", "", ":and:f" }}

为什么“:”用作分隔符,没有空字符串,但是“o”有?

2 个答案:

答案 0 :(得分:2)

使用:

""   "something"   ""    <- fields
   (             )       <- delimiters

假设分隔符在字段之间来,所以你最终得到的是:

"(something)".replaceAll("^\\W*","").replaceAll("\\W*$","").split("\\W+")

您可以通过首先修剪字符串以删除任何前导或尾随分隔符来解决此问题,例如:

"boo:and:foo".split("o", 0)

有类似的东西:

"b"   ""   ":and:f"   <- fields
    o    o            <- delimiters

你会得到:

":"

因为您有连续的分隔符(分隔符为foo时不存在),因此它们之间会有空字段。

并且由于最后"o+"而没有尾随空白字段的原因与此限制为零有关。在这种情况下,将删除尾随(不是前导)空字段。

如果你想摆脱中间的空字段,你可以使用o作为分隔符,因为它会贪婪地将连续的replaceAll字符吸收到一个分隔符中。您还可以使用上面显示的SELECT i.name, c.name, loc.name FROM `item` i CASE WHEN (i.loc_exception IS NOT NULL) THEN ( JOIN `location_exceptions` le ON i.loc_exception = le.id JOIN `location` loc ON le.id_location = loc.id JOIN `city` c ON loc.`id_city` = c.id ) ELSE ( JOIN `location` loc ON i.`id_location` = loc.id JOIN `city` c ON i.`id_city` = c.id ) WHERE i.id = 5 技巧摆脱前导空字段。

答案 1 :(得分:0)

实际上原因不在于您选择的分隔符,在后一种情况下,您有两个o s逐个跟随。它们之间有什么关系?空字符串是。

也许它在开始时是有争议的,你可能会认为跳过空字符串会更好。但是有两种非常流行的格式可以在文本文件中存储数据。制表符分隔值和逗号分隔值。

让我们假设您希望以name,surname,age格式存储有关人员的信息。例如Peter,Green,12。但是如果你想存储关于你不知道姓氏的人的信息呢?它应该看起来像Mike,,13。然后,如果你用逗号分割,你得到'Mike', '', '13'并且你知道第一个元素是名字,第二个元素是空姓,第三个元素是年龄。但如果您选择跳过空字符串,那么您将获得'Mike', '13'。你无法理解缺少哪个领域。