为什么String.split表现得像这样?

时间:2014-06-23 10:56:14

标签: java regex string

我的代码是

public class Main
{

    public static void main(String[] args)
    {

        String inputString = "#..#...##";

        String[] abc = inputString.trim().split("#+");

        for (int i = 0; i < abc.length; i++)
        {
            System.out.println(abc[i]);
        }

        System.out.println(abc.length);

    }
}

输出abc是长度为3的数组。 abc [0]是一个空字符串。 abc中的另外两个元素是..和......

如果我的inputString是&#34; .. ## ...&#34;。我没有在split函数返回的数组中得到一个空字符串。在这两种情况下,输入字符串都没有尾随空格。

soemone可以解释一下为什么我在上面显示的代码中有额外的空间?

4 个答案:

答案 0 :(得分:1)

你没有获得额外的空间,你得到空字符串(长度为0)。它在javadoc中这样说:

 * <p> When there is a positive-width match at the beginning of this
 * string then an empty leading substring is included at the beginning
 * of the resulting array. A zero-width match at the beginning however
 * never produces such empty leading substring

答案 1 :(得分:0)

当您按#+分割并且输入字符串的第一个字符为#时,输入将在开头处自动分割,您获得的是一个空字符串作为字符串的第一个元素。这是因为第一个#的左侧只是锚^,它只会在结果数组中给出一个空字符串。

答案 2 :(得分:0)

来自Javadoc

  

此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。因此,尾随空字符串不包含在结果数组中。

Javadoc

  

如果n为零,则模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。

答案 3 :(得分:0)

无论何时将.split表示为String,它都会将字符串n分割满条件。

所以当你说

String inputString = "#..#...##";

并且您的分割条件为#,并且由于第一次出现#之前的值为emptyabc[0]将保留empty。因此,abc的计数将返回3,因为abc [0] =无(空字符串),abc [1] = .. abc [2] = ...