Java使用负前瞻将字符串拆分为字符

Java使用负前瞻将字符串拆分为字符,java,regex,string,split,Java,Regex,String,Split,我试图将字符串拆分为字符串数组,问题是.split()也返回空元素(“测试”)。拆分将返回[,“t”,“e”,“s”,“t”] 这个问题的解决方案解决了这个问题(使用.split((?!^)”)) 然而,我仍然无法理解为什么这样做,我不会使用一段我无法理解的代码,因为它完成了任务 我已经阅读了这两页关于消极展望的文章,但仍然无法理解。有人能澄清这一点吗?使用(“test”)。split()将在字符前的每个位置拆分字符串,导致[“”、“t”、“e”、“s”、“t”],因为第一次拆分(在t之前)将导

我试图将字符串拆分为字符串数组,问题是
.split()
也返回空元素<代码>(“测试”)。拆分将返回
[,“t”,“e”,“s”,“t”]

这个问题的解决方案解决了这个问题(使用
.split((?!^)”)

然而,我仍然无法理解为什么这样做,我不会使用一段我无法理解的代码,因为它完成了任务

我已经阅读了这两页关于消极展望的文章,但仍然无法理解。有人能澄清这一点吗?

使用
(“test”)。split()
将在字符前的每个位置拆分字符串,导致
[“”、“t”、“e”、“s”、“t”]
,因为第一次拆分(在
t
之前)将导致一个空条目

此正则表达式(
“(?!^)”
)的意思是:在每个字符处拆分字符串,其中不是行开始(^)是前一个字符*:

您的字符串(对于正则表达式引擎)基本上如下所示:
^test$
因此,正则表达式将执行每个拆分,除了第一个
t
之前的拆分,因为在那里它匹配
^
-并且当当前位置前面的字符是
^
(字符串/行开始)时,它不应该拆分


*实际上,
^
不是一个字符,这就是为什么在
$
之前没有另一个拆分-它们只是元字符-可以这么说。

Hm,可能我不理解你的问题,但为什么不使用方法?

你需要首先理解为什么返回的数组包含一个空的第一个元素。当您在索引
0
处出现的分隔符上拆分字符串时,它也将在该分隔符上拆分。现在,分隔符的左侧是一个空字符串,它存储在数组的索引
0

因此,以下代码将第一个数组元素作为空字符串:

"#ab#c".split("#");  // ["", "ab", "c"]
"abc".split("(?<!^)");  // ["a", "b", "c"]
但是,如果
#
不是字符串的第一个字符,则不会在索引0处获得空字符串

现在,如果不希望将空字符串作为第一个元素,只需避免在第一个
上拆分。你会怎么做?只需使用反向查找,确保要拆分的
#
不在字符串的开头-
^

"#ab#c".split("(?<!^)#");  // ["ab", "c"]
类似地,消极的前瞻也可以工作-
(?!^)
,但在我看来,消极的前瞻在这里更直观



当然,如果您只想将字符串拆分为字符数组,可以使用method。

为什么不使用
string#tocharray()在程序中使用的一个类中有一个属性,它被定义为String,该属性用于与输入的字母进行比较。现在我明白了,感谢您提供了清晰简洁的答案。