Java Regex Split \\ S - >字符串拆分方法的错误结果\\ S.

时间:2014-08-30 08:04:10

标签: java regex string split

我对Java中使用正则表达式的拆分方法感到困惑。这是一个相当理论化的问题,加速了,我无法弄清楚。

我找到了这个答案:Java split by \\S 但使用\\ s而不是\\ S的建议并没有解释这里发生了什么。

为什么:quote.split(" \\ S")在案例A中有2个结果,在案例B中有8个结果?

案例A)

String quote = " x xxxxxx";
String[] words = quote.split("\\S"); 
System.out.print("\\S >>\t");
for (String word : words) {
  System.out.print(":" + word);
}
System.out.println(words.length);

结果:

\\ S>> :: 2

案例B)

String quote = " x xxxxxx ";
String[] words = quote.split("\\S"); 
System.out.print("\\S >>\t");
for (String word : words) {
  System.out.print(":" + word);
}
System.out.println(words.length);

结果:

\\ S>> ::::::: 8

理解这里发生的事情会很棒。提前谢谢。

1 个答案:

答案 0 :(得分:3)

正如Jongware所注意到的,String.split(String)的文档说:

  

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

所以它有点像这样:

"a:b:::::".split(":")  === removeTrailing([a,b,,,,,])  === [a,b]
"a:b:::::c".split(":") === removeTrailing([a,b,,,,,c]) === [a,b,,,,,c]

在你的例子中:

" x xxxxxx".split("\\S")  === removeTrailing([ , ,,,,,,])  === [ , ]
" x xxxxxx ".split("\\S") === removeTrailing([ , ,,,,,, ]) === [ , ,,,,,, ]

要将多个分隔符合并为一个分隔符,请使用\S+模式。

" x xxxxxx".split("\\S+")  === removeTrailing([ , ,])  === [ , ]
" x xxxxxx ".split("\\S+") === removeTrailing([ , , ]) === [ , , ]

正如评论中所建议的,为了维护尾随的空字符串,我们可以使用带有负数的分割方法(String.split(String, int))的重载版本作为限制。

"a:b:::::".split(":", -1)  === [a,b,,,,,]