为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2019-05-12 11:08:58
请问各位大佬。为什么console.log(/(?=^a)bd/.test('abd,bcd'))//为什么会打印出false。可能是我对?=这个东西理解还不够深
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

我是这样记的,一般的正则符号匹配的是一个或多个字符,而这些前瞻后瞻规则匹配的是一个位置。想象在待匹配的字符串的每个字符前后都有一个光标在闪,这些光标就是我说的位置。
(?=exp)匹配一个位置,这个位置的后面跟的是exp(?!exp)匹配一个位置,这个位置的后面跟的不是exp(?<=exp)匹配一个位置,这个位置的前面是exp(?(?=^a)bd的意思是:先匹配一个光标位置,这个位置的后面必须是字符串开头接着是一个a接着这个位置的后面紧跟着是bd
所以这里就矛盾了,永远也不可能有字符串满足这个正则,一个位置的后面既要是^a又要紧跟着bd。
反过来bd(?=a)就对了,匹配db后面跟一个位置,这个位置的后面必须是a。(?<=^a)bd也解释的通,匹配一个位置,这个位置的前面必须是开头+a,然后紧跟着bd。
这样分析是不是很好理解?不用去记到底括号放前面还是后面。记住它们匹配的是一个光标位置就OK。这就是零宽度断言的含义,零宽度就是说它们匹配的是一个没有长度的光标位置。哈哈
                            
查看完整回答
反对 回复 2019-05-12
?
交互式爱情

TA贡献1712条经验 获得超3个赞

正向前瞻,去了解下?=a是说后面是否带有a而?=^又是开头的意思,所以为false
/(?<=^a)bd/.test('abd,bcd')
这样就为true
                            
查看完整回答
反对 回复 2019-05-12
  • 2 回答
  • 0 关注
  • 393 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信