String.split
正则表达式分割字符串
保留末尾空格与空字符串情形
split(delimiter) 默认会从结果数组中去掉空字符串.
1 | jshell> "abc|def| 123| 456|| ".split("\\|") |
要关闭这个机制,将重载方法 split(delimiter, limit) 的 limit 设置为负值,如
1 | jshell> "abc|def| 123| 456||".split("\\|",-1) |
更详细的介绍:
split(regex) 内部是调用split(regex, 0)的返回结果,参考官方文档 documentation 有这个方法的详细介绍
limit参数控制应用pattern的次数,因此会影响所得数组的长度。
如果限制n大于零,则将最多应用n-1次该pattern,该数组的长度将不大于n,并且该数组的最后一个条目将包含除最后一个匹配的定界符之外的所有输入。
如果n为非正数,则该pattern将被尽可能多地应用,并且数组可以具有任何长度。
如果n为零,则该pattern将被尽可能多地应用,该数组可以具有任何长度,并且尾随的空字符串将被丢弃。
1 | // 最多匹配三次 |
Exception:
空字符串分拆的情况
值得一提的是,只有在拆分机制创建了空字符串,删除尾随的空字符串才有意义。 因此,对于空字符串的分拆"".split(任何东西),因为我们无法进一步拆分"",所以我们将得到结果[""]数组。发生这种情况是因为此处未发生拆分,因此尽管存在空白,但""还是尾随表示原始字符串,而不是拆分过程创建的空字符串。
1 | jshell> "".split("[,;]") |
应用样例
Flink 源码: org.apache.flink.configuration.GlobalConfiguration#loadYAMLResource
1 | // 解析yaml文件,获取 key-value |
line.split("#",2):
将一行数据按照#分拆成两部分
1 | jshell> "# this is comments.".split("#",2) |
踢掉空格
1 | List<String> list = Splitter.on(pattern).omitEmptyStrings().splitToList(""); |
StringUtils.split
1 | org.apache.commons.lang.StringUtils#splitByWholeSeparator(java.lang.String, java.lang.String, int) |
分割字符串,正则表达式作为普通字符串