本篇博文将详细解释scala中String.split的参数及用法。
因为scala中的String复用了Java的String,因此这也是Java中String.split的用法。
split函数主要有两种参数形式:
def split(arg0: String): Array[String]
def split(arg0: String, arg1: Int): Array[String]
我们可以将第一种参数形式看作是默认arg1=0的第二种形式,即调用split(StrToSplit)等同于调用了split(StrToSplit, 0)。因此,我将主要介绍第二种参数形式。第二种参数形式中每个参数的意义如下:
arg0: String 是一个正则表达式,代表分割的边界。这个正则表达式成功匹配一次,split的结果中就会加入一个新的子串。子串包含上次匹配后(如果没有上次匹配就是被分割字符串的起始位置)到这次匹配前的所有字符。最后,split函数会将最后一次匹配后剩余的字串作为最后一个子串加入到结果中。
arg1: Int 是对分割后子串的个数的限定。理解这个参数才能正确的运用split函数。
当arg1大于0时,它限制arg0最多成功匹配arg1-1次,也就是说字符串最多被分成arg1个子串。此时split会保留分割出的空字符串(当两个arg0连续匹配或者arg0在头尾匹配,会产生空字符串),直到达到匹配上限。比如:
1 scala> "a-b-c".split("-", 2) 2 res38: Array[String] = Array(a, b-c) 3 4 scala> "a-b-c".split("-", 4) 5 res39: Array[String] = Array(a, b, c) 6 7 scala> "-a-b-c--".split("-", 3) 8 res40: Array[String] = Array("", a, b-c--) 9 10 scala> "-a-b-c--".split("-", 6) 11 res41: Array[String] = Array("", a, b, c, "", "") 12 13 scala> "-a-b-c--".split("-", 5) 14 res42: Array[String] = Array("", a, b, c, -) 15 16 scala> "-a-b-c--".split("-", 8) 17 res43: Array[String] = Array("", a, b, c, "", "")
当arg1等于0时,split函数会尽可能多的匹配arg0,但不再保留处于末尾位置的空字符串(这里的一个特殊情况是,当被分割字符串是一个空字符串时,分割结果仍是一个空字符串组成的数组)。比如:
1 scala> "a-b-c".split("-", 0) 2 res48: Array[String] = Array(a, b, c) 3 4 scala> "a-b-c---".split("-", 0) 5 res49: Array[String] = Array(a, b, c) 6 7 scala> "-a--b--c---".split("-", 0) 8 res50: Array[String] = Array("", a, "", b, "", c) 9 10 scala> "".split("-", 0) 11 res51: Array[String] = Array("")
当arg1小于0时,split函数会尽可能多的匹配arg0,并且保留末尾的空字符串。比如:
1 scala> "a-b-c".split("-", -1) 2 res52: Array[String] = Array(a, b, c) 3 4 scala> "-a--b--c-".split("-", -1) 5 res53: Array[String] = Array("", a, "", b, "", c, "")
在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,函数返回是一个数组。在其中每个出现regex的位置都要进行分解。 需要注意是有以下几点: (1)regex是可选项。字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。 (2)limit也是可选项。该值用来限制返回数组中的元素个数。 (3)要注意转义字符:“.”和“|”都是转义字符,必须得加"\\"。同理:*和+也是如此的。 如果用“.”作为分隔的话,必须是如下写法: String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 如果用“|”作为分隔的话,必须是如下写法: String.split("\\|"),这样才能正确的分隔开,不能用String.split("|"); (4)如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acountId=? and act_id =? or extra=?”,把三个都分隔出来,可以用 String.split("and|or"); (5)split函数结果与regex密切相关,常见的几种情况如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public
class
SplitTest
{
public
static
void
main
(
String
[
]
args
)
{
String
str1
=
"a-b"
;
String
str2
=
"a-b-"
;
String
str3
=
"-a-b"
;
String
str4
=
"-a-b-"
;
String
str5
=
"a"
;
String
str6
=
"-"
;
String
str7
=
"--"
;
String
str8
=
""
;
split
(
str1
)
;
split
(
str2
)
;
split
(
str3
)
;
split
(
str4
)
;
split
(
str5
)
;
split
(
str6
)
;
split
(
str7
)
;
split
(
str8
)
;
}
public
static
void
split
(
String
demo
)
{
String
[
]
array
=
demo
.
split
(
"-"
)
;
int
len
=
array
.
length
;
System
.
out
.
print
(
"\""
+
demo
+
"\" 分割后的长度为:"
+
len
)
;
if
(
len
>=
0
)
{
System
.
out
.
print
(
",分割后的结果为:"
)
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
System
.
out
.
print
(
" \""
+
array
[
i
]
+
"\""
)
;
}
}
System
.
out
.
println
(
)
;
}
}
|
运行结果为: "a-b" 分割后的长度为:2,分割后的结果为: "a" "b" "a-b-" 分割后的长度为:2,分割后的结果为: "a" "b" "-a-b" 分割后的长度为:3,分割后的结果为: "" "a" "b" "-a-b-" 分割后的长度为:3,分割后的结果为: "" "a" "b" "a" 分割后的长度为:1,分割后的结果为: "a" "-" 分割后的长度为:0,分割后的结果为: "--" 分割后的长度为:0,分割后的结果为: "" 分割后的长度为:1,分割后的结果为: "" 由此可以得出来: 当字符串只包含分隔符时,返回数组没有元素; 当字符串不包含分隔符时,返回数组只包含一个元素(该字符串本身); 字符串最尾部出现的分隔符可以看成不存在,不影响字符串的分隔; 字符串最前端出现的分隔符将分隔出一个空字符串以及剩下的部分的正常分隔;