Java| String的split方法是如何分割字符串的?
程序员文章站
2022-03-15 20:53:20
...
在Java程序中我们经常会用到字符串的分隔,例如分裂 CSV 文件中的数据来获取所有不同的值。Java中提供了一下两个方法来分隔字符串
- public String[] split(String regex)
- public String[] split(String regex, int limit)
split方法的作用是根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
limit 参数控制模式应用的次数,因此影响所得数组的长度。
- 如果该限制
n 大于 0
,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n
,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。
- 如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。
如果n 等于 0
,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃
。
例如,字符串 "boo:and:foo"
使用这些参数可生成以下结果:
Regex | Limit | 结果 |
---|---|---|
: | 2 | { "boo", "and:foo" } |
: | 5 | { "boo", "and", "foo" } |
: | -2 | { "boo", "and", "foo" } |
o | 5 | { "b", "", ":and:f", "", "" } |
o | -2 | { "b", "", ":and:f", "", "" } |
o | 0 | { "b", "", ":and:f" } |
接下来介绍一下分隔符号为特殊字符(正则元字符)时,我们应该如何来进行字符串分隔?
如果分隔的是正则的元字符(.$|()[{^?*+\\
),那么这些元字符是不能自己分隔的,否则结果将不会是预期的结果.
在Java中我们需要使用\\元字符
来匹配,比如我们需要匹配字符串yveshe|hello
中的|
我们需要将regex写成\\|
.
这里为什要使用2个
\\
,就需要理解Java中的转义字符\
,其实第一个\
是转义字符,第二个\
是被转义的字符:
转义字符只允许转义\b \t \n \f \r \" \' \\
下面是使用split需要分隔一些正则中特殊字符的2中处理方式:
public static void main(String[] args) {
String content = " yveshe|hello";
/* 方式一:使用转义字符转义 */
String[] split1 = content.split("\\|");
System.out.println(Arrays.toString(split1));
System.out.println("*********************");
/* 方式二: 使用Pattern */
String[] split2 = content.split(Pattern.quote("|"));
System.out.println(Arrays.toString(split2));
}
输出结果
[ yveshe, hello]
*********************
[ yveshe, hello]
注意点:
- split(String regex)底层是调用的split(String regex,0)当limit等于0时结尾空字符串将被丢弃.
- 如果 regex 不匹配输入字符串的任何部分,那么结果数组只有一个元素,即这个字符串.
- 调用此方法的 str.split(regex, n) 形式与表达式
Pattern.compile(regex).split(str, n)
产生的结果完全相同 - 关于分隔符号为一些特殊的符号时,我们可以使用反斜杠使得特殊字符作为正规字符或者使用Patter来转换字面量的方式,就像我在上面的程序中使用管道(|)来分隔字符串一样。
相关Java中Patter的使用方式
相关Java中转义字符和路径符
参考:
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-