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

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


天生我才必有用哈
浏览 1645回答 1
1回答

橋本奈奈未

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