正则表达式 - 如何理解javascript正则“反向引用”
高洛峰
高洛峰 2017-04-10 14:28:55
[JavaScript讨论组]

代码如下:

'aaabbbcccdddeeefff'.match(/[abc]\1/g);//null
'aaabbbcccdddeeefff'.match(/([abc])\1/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/(([abc])\1)\1/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/(([abc])\1)\2/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/((([abc])\1)\2)\3/g);//["aaa", "bbb", "ccc"]

第一行可以验证出,反向引用针对的是分组。
第二三行结果,符合预期。
后面的就不懂了。。。
求解释,为什么??这个分组,针对的是嵌套分组,还是平行分组(/()()()/)?

按我的理解,第四行结果应当是:["aaaa", "bbbb", "cccc"],但给的测试串没有四个的,所以应当匹配无果,null。

ps:运行结果都是在chrome版本 35.0.1916.153 m下运行。

总结下结论

每个反向引用都由一个编号或名称来标识,并通过“\编号”表示法进行引用,外面的组的编号靠前。也就是说引用分组是编号排列是从外到内编排。

基于此理论,就可以很好地解释代码的运行结果。

感谢@JerryZou。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
伊谢尔伦

首先先看下面这个例子:

"abcd".match(/(a(bc)d)/);
//result: ["abcd", "abcd", "bc"]

这个例子说明看括号匹配顺序是按左括号计算的。

再看这个例子

'aaa'.match(/(a\1)/);
//result: ['a']
'aaaaaaa'.match(/(a\1\1\1\1\1)/);
//result: ['a']

/(a\1)/在第一个括号中使用\1引用是没有意义的,看来在chrome中的测试结果表明,无论在第n个括号中有几个\n都会被忽略。

基于这个原因,我来解释一下,浏览器其实把题主的正则翻译成以下这样:

'aaabbbcccdddeeefff'.match(/[abc]\1/g);//null
'aaabbbcccdddeeefff'.match(/([abc])\1/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/(([abc]))\1/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/(([abc]))\2/g);//["aa", "bb", "cc"]
'aaabbbcccdddeeefff'.match(/((([abc]))\2)\3/g);//["aaa", "bbb", "ccc"]

下面三行中的第一个\1其实被忽略了,所以此处结果合情合理。

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

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