欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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-

相关标签: String