String.split vs StringUtils.split in Java 给出不同的结果

String.split vs StringUtils.split in Java gives different results

考虑如下带有分隔符 __|__.

的字符串
String str = "a_b__|__c_d";

str.split("__\|__") 给出 2 个拆分 a_b 和 c_d StringUtils.split(str, "__|__") or StringUtils.split(str, "__\|__") 给出了 4 个拆分 a、b、c、d,这是不需要的。

有没有办法让 StringUtils.split() 得到相同的结果 String.split()?

不,根据文档,StringUtils.split 的第二个参数是所有被视为分隔符的字符的列表。 Apache Commons 中有一个不同的函数可以满足您的需求 - StringUtils.splitByWholeSeparator。尽管如此,我还是不明白简单 String.split.

有什么问题

String.split() 有一些 very surprising semantics, and it's rarely what you want. You should prefer StringUtils (or Guava's Splitter,在前面 link) 中讨论过。

您的具体问题是 String.split() 采用正则表达式,而 StringUtils.split() uses each character as a separate token. You should use StringUtils.splitByWholeSeparator() 根据完整字符串的内容进行拆分。

StringUtils.splitByWholeSeparator(str, "__|__");