正则里括号里引用时感觉引用未发挥作用,例子如下
/((a)b\1(c))/.test('abc');
// true
这里的\1
其实是想引用第一个分组,如果正则是/((a)b(c))\1/
,那么毫无疑问,第一个分组时abc
,而将\1
写在分组(括号)里,怎么就失效了呢?
正则里括号里引用时感觉引用未发挥作用,例子如下
/((a)b\1(c))/.test('abc');
// true
这里的\1
其实是想引用第一个分组,如果正则是/((a)b(c))\1/
,那么毫无疑问,第一个分组时abc
,而将\1
写在分组(括号)里,怎么就失效了呢?
我理解是这样的,/((a)b\1(c))/.test('abc');
,第一组为匹配的((a)b\1(c))
,\1
引用的组号是自己,当匹配自己组号的时候是不起作用的,因为你的分组还没有匹配到任何东西,分组信息是基于栈的形式,/((a)b(c))\1/
比如第二个例子,第一组匹配的内容是abc,它会将abc压入到栈顶,当使用反向引用的时候它会从栈顶中获取到abc,其实第二个正则表达式匹配的则是abcabc
详细请参考我之前写的.net的正则表达式文章(原理是通的):浅析正则表达式-原理篇
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
显然你的分组1不是你想得那样,试试这样改改:
/(?:(a)b\1(c))/.test('abc')