代码如下:
'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。
首先先看下面这个例子:
这个例子说明看括号匹配顺序是按左括号计算的。
再看这个例子
/(a\1)/
在第一个括号中使用\1
引用是没有意义的,看来在chrome中的测试结果表明,无论在第n个括号中有几个\n
都会被忽略。基于这个原因,我来解释一下,浏览器其实把题主的正则翻译成以下这样:
下面三行中的第一个
\1
其实被忽略了,所以此处结果合情合理。