答案给出,见下面 - 士气:从来没有呼吁.split()
孤独;如果你想要健全的行为,总是给它一个-1的长度参数。但不是0!Java的.split()方法的角落案例:它们是什么?
的javadoc for Pattern.split()
状态如下:
通过此方法返回的数组包含由另一个子序列匹配该图案或由输入序列的末端封端的封端的输入序列的每个子字符串。
证人此代码:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
}
现在,指的的Javadoc,阵列应包含其输入要么的子串(引用):
- “由另一个子序列终止匹配这种模式“:好吧,有一个 - 紧接在下划线之前的空字符串(其明显匹配
UNDERSCORE
); - 或“由输入序列的末尾终止”:还有一个:紧跟在下划线之后的空字符串。
然而,上述代码打印0
。为什么?这是一个已知的错误? (imnsho是的,见下文).split()
不遵守其合同的其他情况是什么? (再次,见下文)
应答(右低于此说明性质文本)
当使用Pattern
,单参数.split()
方法等效于调用两参数法0
如一个论点。
这就是错误所在。自变量为0,从结果中删除数组末尾的所有空字符串“向下”到第一个非空元素。
如果在阅读本文之前,您不知道braindead设计决定是什么,现在您知道了。而且这是默认行为更加危险。
解决方法是始终使用.split()
方法的完整形式并给它一个负长度参数。这里选择-1。在这种情况下,.split()
行为三立:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
System.out.println(UNDERSCORE.split("__").length);
System.out.println(UNDERSCORE.split("_x_").length);
System.out.println(UNDERSCORE.split("_", -1).length);
System.out.println(UNDERSCORE.split("__", -1).length);
System.out.println(UNDERSCORE.split("_x_", -1).length);
}
输出:
0 # BUG!
0 # BUG!
2 # BUG!
2 # OK
3 # OK
3 # OK
你引用的Javadoc。阅读...... – wchargin