为什么拆分`(?!^)`和`(?<! - ^)`产生相同的答案? - >

时间:2013-10-21 20:13:49

标签: java regex

以下两行代码:

System.out.println(Arrays.toString("test".split("(?<!^)")));
System.out.println(Arrays.toString("test".split("(?!^)")));

每个产生相同的输出:

[t, e, s, t]

我预计底线会产生

[, t, e, s, t]

因为它应该愿意在^之后和t之前分开。有人可以指出我的想法是错的吗?

1 个答案:

答案 0 :(得分:7)

(?!^)匹配不在字符串开头的任何位置,就像(?<!^)一样。由于^锚点没有任何长度,因此无论您是向前还是向后都无关紧要。

想象一下这样的字符串test,其中|表示字符之间的位置

|  t  |  e  |  s  |  t  |
^ matches here         ($ matches here)

(?!^)在位置0处不匹配,因为当向前看0个字符时,正则表达式引擎从此处“看到”字符串的开头

(?<!^)在这里不匹配,因为当向后看0个字符时,正则表达式引擎从这里“看到”字符串的开头