为什么以竖线结尾的正则表达式永真?

  1. 昨天升级webpack,升级后编译一直存在问题,最终定位原因为正则表达式写错导致。但是原因有点蹊跷。
  2. 正则表示式如下

    var reg=/abc|/
    reg.test('ddd')

    结果:
    true

  3. clipboard.png
  4. 网上搜了下,没搜到解释。 在idea里试了下,| 也是匹配所有. 求知道原因的同学不吝赐教,最好给出文档!!!
阅读 5.1k
6 个回答

看了各位答主的回答,我整理了一种解释如下:

每一个正则表达式的限定即包含了位置限定也包含了字符限定。只有既满足位置约束也满足字符约束的字符串才会评估为true.

比如,

^cat 位置限定为行开头,字符限定为cat
cat 位置限定为任意位置, 字符限定为cat

所以/abc|/的解释就是匹配任意位置开始的abc串或者匹配任意位置.

因为任何字符串即使是空串也是有位置信息(开头,结尾都算位置信息)的,所以自然任何字符串都可以匹配上了。

不知道这个解释,大家觉得如何?

从测试的结果来看,如果|前面没有匹配上的话,以|结尾仅仅是匹配字符间的位置,仅仅是匹配一个位置,有 n 个字符,就有 n+1 个位置可以匹配,所以空字符串,也可以匹配到一个位置,所以永远为真:

clipboard.png

最后在 reg101 上是这么解释的:

clipboard.png

Empty alternative effectively truncates the regex as this point because it will always find a zero-length match

你这么写的意思是匹配abc或什么都不匹配,任何字符串都可以什么都不匹配

|表示,因此/abc|/,表示匹配abc任意单个或多个字符正则表达式

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题