我正在开发一个应用程序,该应用程序使用以下分隔的信息解析文本文件:
id#title#author
某些行不包含作者的数据,只是空白,但最后仍有#。使用Java的内置拆分,返回的长度只有2.我是否需要在函数中手动检查返回数组的长度,还是有其他方法?
例如:
26380#Complete Story of the San Francisco Horror#
如果未列出,我正在尝试为作者返回空值。我目前正在使用:
data.split("#")
答案 0 :(得分:3)
使用重载方法
yourString.split("#", -1)
此方法返回的数组包含此子字符串 由与给定匹配的另一个子字符串终止的字符串 表达式或由字符串的结尾终止。
[...]
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("#")
。