首页 > 求解以下正则表达式

求解以下正则表达式

console.log("aa,bb".match(/((?!,).)+/)[0]);//aa
console.log("aa,bb".match(/(.(?!,))+/)[0]);//a

哪位大神能科普下这个正则的解析原理?


这两个都使用了捕获组的负向先行(Negative Lookahead assertions)断言。原理的话我之前专门整理过正则的匹配原理和JS中正则的一些特性:?正则与JS中的正则


简单地说是顺序的区别。

console.log("abcde,bb".match(/((?!,).)+/)[0]);//abcde
console.log("abcde,bb".match(/(.(?!,))+/)[0]);//abcd

((?!,).)(.(?!,))都使用了正向断言的,当要执行匹配的时候右边一定不能等于,字符。(额,到底是正向还是负向。。。

不要说正向负向了。(具体看评论
lookahead翻译成前瞻吧
(?!expression)是前瞻断言的一种


(?!pattern) 即负向先行断言,意思是后面不能是 pattern(?!,) 意思就是下一个字符不能是逗号。(?!,). 也就相当于 [^,](严格来说在 dotall flag 下才是)。

第一行也就相当于匹配 ([^,])+,所以是 "aa"
第二行是匹配“一个以上字符,直到再下一个是逗号为止”,所以是 "a"


接@eph ,而括号内()是对匹配到的字符串分组,第一个出现的()就是第一组及索引为0的元素。
也就是说((?!,).)就匹配到了'aa',其中(?!,)匹配到了第一个'a',而.匹配到了第二个'a'
(.(?!,))中,.匹配到了第一个'a'(?!,)什么也没有匹配到。
后面+的意思是说对前面紧挨着的匹配规则,如果能匹配到则至少匹配一个。
/ao+/g,则可以匹配到'ao'或者'aooooo'

【热门文章】
【热门文章】