请问各位大佬。
为什么console.log(/(?=^a)bd/.test('abd,bcd'))//为什么会打印出false。 可能是我对?=这个东西理解还不够深
请问各位大佬。
为什么console.log(/(?=^a)bd/.test('abd,bcd'))//为什么会打印出false。 可能是我对?=这个东西理解还不够深
13 回答12.8k 阅读
7 回答2k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答918 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
我是这样记的,一般的正则符号匹配的是一个或多个字符,而这些前瞻后瞻规则匹配的是一个位置。想象在待匹配的字符串的每个字符前后都有一个光标在闪,这些光标就是我说的位置。
(?=exp) 匹配一个位置,这个位置的后面跟的是exp
(?!exp) 匹配一个位置,这个位置的后面跟的不是exp
(?<=exp) 匹配一个位置,这个位置的前面是exp
(?<!exp) 匹配一个位置,这个位置的前面不是exp
(?=^a)bd
的意思是:先匹配一个光标位置,这个位置的后面必须是字符串开头接着是一个a
接着这个位置的后面紧跟着是bd
所以这里就矛盾了,永远也不可能有字符串满足这个正则,一个位置的后面既要是 ^a 又要紧跟着 bd。
反过来
bd(?=a)
就对了,匹配 db 后面跟一个位置,这个位置的后面必须是a。(?<=^a)bd
也解释的通,匹配一个位置,这个位置的前面必须是开头+a,然后紧跟着bd。这样分析是不是很好理解?不用去记到底括号放前面还是后面。记住它们匹配的是一个光标位置就 OK。这就是
零宽度断言
的含义,零宽度就是说它们匹配的是一个没有长度的光标位置。哈哈