java - 拆分字符串后,数组中的第一个元素是什么?

use*_*814 11 java regex arrays string

我试图将一个字符串拆分成一个单个字母的数组.这就是我做的,

String str = "abcddadfad"; 
System.out.println(str.length());    //  output: 10  
String[] strArr = str.split("");  
System.out.println(strArr.length);   //  output: 11   
System.out.println(strArr[0]);       // output is nothing 
Run Code Online (Sandbox Code Playgroud)

新数组确实包含了所有字母,但它在索引0处没有任何内容,甚至没有空格,但仍然增加了数组的大小.任何人都可以解释为什么会这样吗?

rol*_*lfl 13

考虑拆分表达式 ",1,2,3,4".split(",");

你会期待什么?对,一个空字符串开头.在你的情况下,你在第一个'a'前面有一个'没有',在它后面有一个'没有'.

更新:评论表明这个解释是不够的解释(它可能不是)...但是,它真的很简单:引擎从字符串的开头开始,它看起来是否在前面是什么它匹配模式.如果是,则将其背后的内容分配给拆分中的新项目.

在第一个字符上,它有""(后面没有任何东西),它看起来在它前面是否有""(图案).有,所以它创造了一个""匹配.

然后它继续前进,它后面有一个'a',再一次,它再次出现在它前面.所以第二个结果是一个"a"字符串.

一个有趣的观察是,如果您使用,split("", -1)您还将在结果数组的最后位置获得空字符串结果.


编辑2:如果我进一步绞尽脑汁,并认为这是一个学术练习(我不会在现实生活中推荐这个......)我只能想到一个很好的方法来split()将一个String 的正则表达式转换成一个String[]数组每个字符串中有1个字符(而不是char [] - 其他人给出了很好的答案......).

String[] chars = str.split("(?<=.)", str.length());
Run Code Online (Sandbox Code Playgroud)

这将在非捕获组中查看每个字符的后面,然后将其拆分,然后将数组大小限制为字符数(您可以将其保留str.length(),但如果放置-1,最后将获得额外的空间)

借用nitro2k01的替代方法(在评论下面)引用字符串的开头和结尾,你可以可靠地拆分:

String[] chars = str.split("(?!(^|$))");
Run Code Online (Sandbox Code Playgroud)


Jes*_*son 2

您可以只使用 string 类中的内置 java 方法。myString.toCharArray()空字符串存储在索引 0 处