Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么String.split的行为是这样的?_Java_Regex_String - Fatal编程技术网

Java 为什么String.split的行为是这样的?

Java 为什么String.split的行为是这样的?,java,regex,string,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++) { Syst

我的代码是

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);

    }
}
公共类主
{
公共静态void main(字符串[]args)
{
String inputString=“#…#…#…##”;
String[]abc=inputString.trim().split(“#+”);
for(int i=0;i
输出abc是长度为3的数组。 abc[0]为空字符串。abc中的另外两个要素是。。而且

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


soemone能解释一下为什么在上面显示的代码中会有一个额外的空格吗?

当您按
+
拆分时,输入字符串的第一个字符是
,然后输入在开始时被拆分,得到的是一个空字符串作为字符串的第一个元素。这是因为第一个
#
的左侧只是锚定
^
,它将只在结果数组中提供一个空字符串。

您不会获得额外的空间,而是获得空字符串(长度为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
*当本节开头有正宽度匹配时
*字符串,则在开头包含一个空的前导子字符串
*结果数组的。但是,开始时的零宽度匹配
*从不生成这样的空前导子字符串
来自:

该方法的工作原理类似于使用给定表达式和零限制参数调用双参数split方法。因此,结果数组中不包括尾随的空字符串

以及:

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


无论何时说.split为字符串,它都会将满足该条件的字符串拆分n次

所以当你说

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

拆分的条件是
#
,由于第一次出现
#
之前的值是
空的
abc[0]
将保持
空的
。因此,abc的计数将返回3,因为abc[0]=nothing(空字符串),abc[1]=。。abc[2]=…

如果我的猜测是正确的,它被拆分为“”、“…”。第一个分隔符之前有一个空字符串,因此返回一个空字符串。除非您提供一个额外的参数进行拆分,否则不会返回结尾处的空字符串。结尾处还有
$
。这与答案有什么关系?任何匹配的分隔符都只会导致LHS标记进入结果数组。这不完全是真的,
“o”。split(“o”,2)
给出一个包含两个空字符串的数组。也就是说,
^(match)$
在匹配的两边都给出了空字符串。这只是由于您的第二个参数。您能否提供指向java文档的链接?当然,第一个结果:发布正确的链接。它在Java8SDK中