快捷导航

JS正则环视,为什么结果不一样

var str = 'abacad';var result1 = str.match(/(?=a)a/g);var result2 = str.match(/a(?=a)/g);console.log(result1);console.log(result2);

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员1

首先声明,答者对正则了解不深,所以以下观点请辩证看,可能有误。

(?=)被称为先行断言。作用是当正则匹配到字符时会扫描接下来的字符,看是否符合断言,但是其指针并不向后移动,如例子2:a(?=a)意思是匹配字符“a”且其后必须也是字符“a”,源字符串为“abacad”,正则在匹配时会扫描这个字符串,会有一个指针指向当前位置,当匹配到"a"时,根据规则,还需继续扫描接下来的字符判断是否符合断言,但是这个扫描不影响指针的真实位置,如果接下来那个字符不符合断言表示匹配失败,这时才会移动指针到下一个字符然后重复上述步骤【或者也可以理解为指针确实移动了,但是因为这是断言需要,所以不管断言成功或失败,指针在其后需要回溯到断言前的位置】,并且当匹配成功时仅匹配前面的字符,断言内容不在匹配结果里。
所以题主的第一个正则的/(?=a)a/即前面无任何字符,可以认为只要扫描到a就算符合断言,然后指针回到断言前的位置继续扫描匹配到a,记录到结果,所以其等价于/a/.
第二个的意思就很明显了匹配字符a且其后字符也必须为a。所以结果为null。
回复

使用道具 举报

可能感兴趣的问答

发新帖
TA的信息
  • 会员所属: 注册会员
  • 认证信息: 邮箱认证手机认证
  • 微信访问
  • 手机APP