console.log("aa,bb".match(/((?!,).)+/)[0]);//aa
console.log("aa,bb".match(/(.(?!,))+/)[0]);//a
哪位大神能科普下这个正则的解析原理?
console.log("aa,bb".match(/((?!,).)+/)[0]);//aa
console.log("aa,bb".match(/(.(?!,))+/)[0]);//a
哪位大神能科普下这个正则的解析原理?
简单地说是顺序的区别。
console.log("abcde,bb".match(/((?!,).)+/)[0]);//abcde
console.log("abcde,bb".match(/(.(?!,))+/)[0]);//abcd
((?!,).)
和(.(?!,))
都使用了正向断言的,当要执行匹配的时候右边一定不能等于,
字符。(额,到底是正向还是负向。。。
不要说正向负向了。(具体看评论lookahead
翻译成前瞻吧(?!expression)
是前瞻断言的一种
接@eph ,而括号内()
是对匹配到的字符串分组,第一个出现的()
就是第一组及索引为0
的元素。
也就是说((?!,).)
就匹配到了'aa'
,其中(?!,)
匹配到了第一个'a'
,而.
匹配到了第二个'a'
。
而(.(?!,))
中,.
匹配到了第一个'a'
,(?!,)
什么也没有匹配到。
后面+
的意思是说对前面紧挨着的匹配规则,如果能匹配到则至少匹配一个。
如/ao+/g
,则可以匹配到'ao'
或者'aooooo'
。
这两个都使用了捕获组的负向先行(Negative Lookahead assertions)断言。原理的话我之前专门整理过正则的匹配原理和JS中正则的一些特性:?正则与JS中的正则
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
(?!pattern)
即负向先行断言,意思是后面不能是pattern
。(?!,)
意思就是下一个字符不能是逗号。(?!,).
也就相当于[^,]
(严格来说在 dotall flag 下才是)。第一行也就相当于匹配
([^,])+
,所以是"aa"
;第二行是匹配“一个以上字符,直到再下一个是逗号为止”,所以是
"a"
。