为什么在 `(?!^)` 和 `(?<!^)` 上进行分割会产生相同的结果?

8
以下两行代码:

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

每个产生相同的输出:
[t, e, s, t]

我预计底线会产生以下结果
[, t, e, s, t]

由于它应该愿意在^之后和t之前进行拆分。可以有人指出我的想法错在哪里吗?


实际上,我本来期望两者都返回 [t, e, s, t, ]... - Tim Pietzcker
2
@TimPietzcker split默认忽略尾随的空格。这个 - split("(?<!)", -1)会给出那个结果。 - Rohit Jain
1
@TimPietzcker:我同意,这是split()的一个相当随机的“特性”。 - Keppil
1个回答

7

(?!^) 匹配字符串任何不在开头的位置,就像 (?<!^)。由于锚点 ^ 没有任何长度,所以你向前或向后查找都无关紧要。

将字符串test想象成这样,其中 | 表示字符之间的位置:

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

(?!^) 不匹配位置 0,因为正则表达式引擎从这里开始向前查找零个字符时 "看到" 字符串的开头。

(?<!^) 在此处也不匹配,因为正则表达式引擎向后查找零个字符时 "看到" 了字符串的开头。


1
你在这两种情况下有不同的正则表达式。 - Rohit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接