前言
- jdk的注释已经写的很明白了,本文只是在此基础上再归纳一下。重点是归纳下
str.split(regex, limit)
第二个参数的用法
jdk注释理解
-
matches this pattern
体现了正则表达式的应用,也就是入参可以使用正则,源码也很清晰的在用Matcher m = matcher(input); // Add segments before each match found while(m.find()) { //... } }
-
原始字符串
str
调用split
方法,即String[] = str.split(regex)
接收input,返回一个数组。该数组的元素都为str的子串- str的子串来源于
str
被regex
匹配的字符串分割。- 形如
"1,2,3,4".split(",")
会被分割为["1","2","3","4"]
- 如果input没有匹配到任何值,即
"1234".split(",")
,返回值为["1234"]
- 形如
- str的子串来源于
-
返回值的数组中可以存在0长度的字符串,以下两个返回值都是合法的
["1","2"]
["1","2","",""]
-
String[] = str.split(regex, limit)
考虑函数的第二个参数limit == n > 0
- 返回的字符串数组至多n-1次
limit == n < 0
- 尽可能多的匹配,返回的字符串数组末尾不舍弃空字符串的元素
limt == n == 0
- 尽可能多的匹配,返回的字符串数组末尾舍弃空字符串的元素
使用时机
// 对字符串boo:and:foo , 以字母o作为分割符,尽可能匹配limit次
"boo:and:foo".split("o", limit);
函数解决参数歧义
// 对字符串boo:and:foo , 以字母o作为分割符
"boo:and:foo".split("o", -2);
// 函数看到 limit 为负数,则会尽全力匹配,当调用者自己不知道要匹配多少次的时候,填个负数很管用
// 结果:
{ "b", "", ":and:f", "", "" }
值得一提的是,字符串foo
用o
分隔出了3个 0长度的字符串
f|o|o|
虽然是3个,但是最后一个视为整个字符串的结尾,也就不会加入结果集。
常用的方法都是 limit == 0,解决了什么问题
{ "b", "", ":and:f", "", "" }
如果认为以上的输出比较啰嗦,想把末尾的 0长度的字符串 移出去,只需要让 limit == 0,得到的结果即为
{ "b", "", ":and:f" }