javascript - 求解以下正则表达式
天蓬老师
天蓬老师 2017-04-10 16:36:23
[JavaScript讨论组]
console.log("aa,bb".match(/((?!,).)+/)[0]);//aa
console.log("aa,bb".match(/(.(?!,))+/)[0]);//a

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
黄舟

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

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

伊谢尔伦

简单地说是顺序的区别。

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

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

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

PHPz

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

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号