Java拆分返回意外长度?

时间:2014-04-20 03:50:03

标签: java

我正在开发一个应用程序,该应用程序使用以下分隔的信息解析文本文件:

id#title#author

某些行不包含作者的数据,只是空白,但最后仍有#。使用Java的内置拆分,返回的长度只有2.我是否需要在函数中手动检查返回数组的长度,还是有其他方法?

例如:

26380#Complete Story of the San Francisco Horror#

如果未列出,我正在尝试为作者返回空值。我目前正在使用:

data.split("#")

2 个答案:

答案 0 :(得分:3)

使用重载方法

yourString.split("#", -1)

javadoc

  

此方法返回的数组包含此子字符串   由与给定匹配的另一个子字符串终止的字符串   表达式或由字符串的结尾终止。

     

[...]

     

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

调用String#split(String)等同于调用

yourString.split(yourRegex, 0);

执行最后一行javadoc状态,丢弃尾随空字符串。

然而,这不会在返回的数组的最后位置返回null。它只是一个空字符串。

答案 1 :(得分:2)

  

某些行不包含作者的数据,只是空白,但最后仍有#。使用Java的内置拆分,返回的长度仅为2。

是的 - 在#之前有一个空字符串,在它之后有一个空字符串。这是正确的。

之后可能检查字符串是否为空。有很多方法可以做到这一点。

str.isEmpty(); // strings like "  " are not empty
StringUtils.isBlank(str); // strings like "  " are blank

如果你想要整个正则表达式,请尝试匹配^#*$,或反转[^#]等。正则表达式可能已被制服。可以使用StringUtils.indexOfAnyBut("#")