var str = 'abacad';
var result1 = str.match(/(?=a)a/g);
var result2 = str.match(/a(?=a)/g);console.log(result1);
console.log(result2);
1 回答
已采纳
橋本奈奈未
TA贡献436条经验 获得超108个赞
首先声明,答者对正则了解不深,所以以下观点请辩证看,可能有误。
(?=)被称为先行断言。作用是当正则匹配到字符时会扫描接下来的字符,看是否符合断言,但是其指针并不向后移动,如例子2:a(?=a)意思是匹配字符“a”且其后必须也是字符“a”,源字符串为“abacad”,正则在匹配时会扫描这个字符串,会有一个指针指向当前位置,当匹配到"a"时,根据规则,还需继续扫描接下来的字符判断是否符合断言,但是这个扫描不影响指针的真实位置,如果接下来那个字符不符合断言表示匹配失败,这时才会移动指针到下一个字符然后重复上述步骤【或者也可以理解为指针确实移动了,但是因为这是断言需要,所以不管断言成功或失败,指针在其后需要回溯到断言前的位置】,并且当匹配成功时仅匹配前面的字符,断言内容不在匹配结果里。
所以题主的第一个正则的/(?=a)a/即前面无任何字符,可以认为只要扫描到a就算符合断言,然后指针回到断言前的位置继续扫描匹配到a,记录到结果,所以其等价于/a/.
第二个的意思就很明显了匹配字符a且其后字符也必须为a。所以结果为null。
添加回答
举报
0/150
提交
取消