console.log(/(?=^a)bd/.test('abd,bcd'))//为什么会打印出false

请问各位大佬。
为什么console.log(/(?=^a)bd/.test('abd,bcd'))//为什么会打印出false。 可能是我对?=这个东西理解还不够深

阅读 1.9k
2 个回答

我是这样记的,一般的正则符号匹配的是一个或多个字符,而这些前瞻后瞻规则匹配的是一个位置。想象在待匹配的字符串的每个字符前后都有一个光标在闪,这些光标就是我说的位置。

(?=exp) 匹配一个位置,这个位置的后面跟的是exp
(?!exp) 匹配一个位置,这个位置的后面跟的不是exp
(?<=exp) 匹配一个位置,这个位置的前面是exp
(?<!exp) 匹配一个位置,这个位置的前面不是exp

(?=^a)bd 的意思是:
先匹配一个光标位置,这个位置的后面必须是字符串开头接着是一个a
接着这个位置的后面紧跟着是bd

所以这里就矛盾了,永远也不可能有字符串满足这个正则,一个位置的后面既要是 ^a 又要紧跟着 bd。

反过来 bd(?=a) 就对了,匹配 db 后面跟一个位置,这个位置的后面必须是a。
(?<=^a)bd 也解释的通,匹配一个位置,这个位置的前面必须是开头+a,然后紧跟着bd。

这样分析是不是很好理解?不用去记到底括号放前面还是后面。记住它们匹配的是一个光标位置就 OK。这就是 零宽度断言的含义,零宽度就是说它们匹配的是一个没有长度的光标位置。哈哈

正向前瞻,去了解下
?=a是说后面是否带有a 而?=^又是开头的意思 ,所以为false

/(?<=^a)bd/.test('abd,bcd')

这样就为true

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