- 昨天升级webpack,升级后编译一直存在问题,最终定位原因为正则表达式写错导致。但是原因有点蹊跷。
- 正则表示式如下
var reg=/abc|/
reg.test('ddd')结果:
true - 网上搜了下,没搜到解释。 在idea里试了下,| 也是匹配所有. 求知道原因的同学不吝赐教,最好给出文档!!!
var reg=/abc|/
reg.test('ddd')
结果:
true
从测试的结果来看,如果|前面没有匹配上的话,以|结尾仅仅是匹配字符间的位置,仅仅是匹配一个位置,有 n 个字符,就有 n+1 个位置可以匹配,所以空字符串,也可以匹配到一个位置,所以永远为真:
最后在 reg101 上是这么解释的:
Empty alternative effectively truncates the regex as this point because it will always find a zero-length match
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
看了各位答主的回答,我整理了一种解释如下:
每一个正则表达式的限定即包含了位置限定也包含了字符限定。只有既满足位置约束也满足字符约束的字符串才会评估为true.
比如,
^cat 位置限定为行开头,字符限定为cat
cat 位置限定为任意位置, 字符限定为cat
所以/abc|/的解释就是匹配任意位置开始的abc串或者匹配任意位置.
因为任何字符串即使是空串也是有位置信息(开头,结尾都算位置信息)的,所以自然任何字符串都可以匹配上了。
不知道这个解释,大家觉得如何?