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,该属性用于与输入的字母进行比较。现在我明白了,感谢您提供了清晰简洁的答案。