0%

String.split

String.split

正则表达式分割字符串

保留末尾空格与空字符串情形

split(delimiter) 默认会从结果数组中去掉空字符串.

1
2
3
4
5
6
jshell> "abc|def| 123| 456|| ".split("\\|")
$1 ==> String[6] { "abc", "def", " 123", " 456", "", " " }

jshell> "abc|def| 123| 456||".split("\\|")
$4 ==> String[4] { "abc", "def", " 123", " 456" }
// 最后一个元素为空,会踢掉所有的空元素

要关闭这个机制,将重载方法 split(delimiter, limit)limit 设置为负值,如

1
2
jshell> "abc|def| 123| 456||".split("\\|",-1)
$5 ==> String[6] { "abc", "def", " 123", " 456", "", "" }

更详细的介绍:

split(regex) 内部是调用split(regex, 0)的返回结果,参考官方文档 documentation 有这个方法的详细介绍

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

1
2
3
// 最多匹配三次
jshell> "abc|def| 123| 456||".split("\\|",3)
$6 ==> String[3] { "abc", "def", " 123| 456||" }

Exception:

空字符串分拆的情况

值得一提的是,只有在拆分机制创建了空字符串,删除尾随的空字符串才有意义。 因此,对于空字符串的分拆"".split(任何东西),因为我们无法进一步拆分"",所以我们将得到结果[""]数组。发生这种情况是因为此处未发生拆分,因此尽管存在空白,但""还是尾随表示原始字符串,而不是拆分过程创建的空字符串。

1
2
jshell> "".split("[,;]")
$7 ==> String[1] { "" }

应用样例

Flink 源码: org.apache.flink.configuration.GlobalConfiguration#loadYAMLResource

1
2
3
4
5
6
7
8
9
10
11
// 解析yaml文件,获取 key-value
// 1. 如果 #号前 没有, 则为注释
// 2. #前有,则使用: 分割

// 从文件读取一行数据, 使用#分割
String[] comments = line.split("#", 2);
String conf = comments[0].trim();

// 2. get key and value
if (conf.length() > 0) {
String[] kv = conf.split(": ", 2);

line.split("#",2):

将一行数据按照#分拆成两部分

1
2
3
4
5
6
7
8
jshell> "# this is comments.".split("#",2)
$11 ==> String[2] { "", " this is comments." }

jshell> " # this is comments.".split("#",2)
$12 ==> String[2] { " ", " this is comments." }

jshell> "abc: 123 # this is comments.".split("#",2)
$13 ==> String[2] { "abc: 123 ", " this is comments." }

踢掉空格

1
2
List<String> list = Splitter.on(pattern).omitEmptyStrings().splitToList("");
System.out.println(list.size()); // 0

StringUtils.split

1
org.apache.commons.lang.StringUtils#splitByWholeSeparator(java.lang.String, java.lang.String, int)

分割字符串,正则表达式作为普通字符串