扫码关注官方订阅号
console.log("aa,bb".match(/((?!,).)+/)[0]);//aa console.log("aa,bb".match(/(.(?!,))+/)[0]);//a
哪位大神能科普下这个正则的解析原理?
欢迎选择我的课程,让我们一起见证您的进步~~
(?!pattern) 即负向先行断言,意思是后面不能是 pattern。(?!,) 意思就是下一个字符不能是逗号。(?!,). 也就相当于 [^,](严格来说在 dotall flag 下才是)。
(?!pattern)
pattern
(?!,)
(?!,).
[^,]
第一行也就相当于匹配 ([^,])+,所以是 "aa";第二行是匹配“一个以上字符,直到再下一个是逗号为止”,所以是 "a"。
([^,])+
"aa"
"a"
简单地说是顺序的区别。
console.log("abcde,bb".match(/((?!,).)+/)[0]);//abcde console.log("abcde,bb".match(/(.(?!,))+/)[0]);//abcd
((?!,).)和(.(?!,))都使用了正向断言的,当要执行匹配的时候右边一定不能等于,字符。(额,到底是正向还是负向。。。
((?!,).)
(.(?!,))
,
不要说正向负向了。(具体看评论lookahead翻译成前瞻吧(?!expression)是前瞻断言的一种
lookahead
(?!expression)
接@eph ,而括号内()是对匹配到的字符串分组,第一个出现的()就是第一组及索引为0的元素。也就是说((?!,).)就匹配到了'aa',其中(?!,)匹配到了第一个'a',而.匹配到了第二个'a'。而(.(?!,))中,.匹配到了第一个'a',(?!,)什么也没有匹配到。后面+的意思是说对前面紧挨着的匹配规则,如果能匹配到则至少匹配一个。如/ao+/g,则可以匹配到'ao'或者'aooooo'。
()
0
'aa'
'a'
.
+
/ao+/g
'ao'
'aooooo'
这两个都使用了捕获组的负向先行(Negative Lookahead assertions)断言。原理的话我之前专门整理过正则的匹配原理和JS中正则的一些特性:
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
(?!pattern)
即负向先行断言,意思是后面不能是pattern
。(?!,)
意思就是下一个字符不能是逗号。(?!,).
也就相当于[^,]
(严格来说在 dotall flag 下才是)。第一行也就相当于匹配
([^,])+
,所以是"aa"
;第二行是匹配“一个以上字符,直到再下一个是逗号为止”,所以是
"a"
。简单地说是顺序的区别。
((?!,).)
和(.(?!,))
都使用了正向断言的,当要执行匹配的时候右边一定不能等于,
字符。(额,到底是正向还是负向。。。不要说正向负向了。(具体看评论
lookahead
翻译成前瞻吧(?!expression)
是前瞻断言的一种接@eph ,而括号内
()
是对匹配到的字符串分组,第一个出现的()
就是第一组及索引为0
的元素。也就是说
((?!,).)
就匹配到了'aa'
,其中(?!,)
匹配到了第一个'a'
,而.
匹配到了第二个'a'
。而
(.(?!,))
中,.
匹配到了第一个'a'
,(?!,)
什么也没有匹配到。后面
+
的意思是说对前面紧挨着的匹配规则,如果能匹配到则至少匹配一个。如
/ao+/g
,则可以匹配到'ao'
或者'aooooo'
。这两个都使用了捕获组的负向先行(Negative Lookahead assertions)断言。原理的话我之前专门整理过正则的匹配原理和JS中正则的一些特性: