以下两行代码:
System.out.println(Arrays.toString("test".split("(?<!^)")));
System.out.println(Arrays.toString("test".split("(?!^)")));
每个产生相同的输出:
[t, e, s, t]
我预计底线会产生
[, t, e, s, t]
因为它应该愿意在^
之后和t
之前分开。有人可以指出我的想法是错的吗?
答案 0 :(得分:7)
(?!^)
匹配不在字符串开头的任何位置,就像(?<!^)
一样。由于^
锚点没有任何长度,因此无论您是向前还是向后都无关紧要。
想象一下这样的字符串test
,其中|
表示字符之间的位置:
| t | e | s | t |
^ matches here ($ matches here)
(?!^)
在位置0
处不匹配,因为当向前看0个字符时,正则表达式引擎从此处“看到”字符串的开头
(?<!^)
在这里不匹配,因为当向后看0个字符时,正则表达式引擎从这里“看到”字符串的开头