正则未取到引用的分组

正则里括号里引用时感觉引用未发挥作用,例子如下

/((a)b\1(c))/.test('abc');
// true

这里的\1其实是想引用第一个分组,如果正则是/((a)b(c))\1/,那么毫无疑问,第一个分组时abc,而将\1写在分组(括号)里,怎么就失效了呢?

阅读 1.4k
2 个回答

显然你的分组1不是你想得那样,试试这样改改:/(?:(a)b\1(c))/.test('abc')

我理解是这样的,/((a)b\1(c))/.test('abc');,第一组为匹配的((a)b\1(c)),\1引用的组号是自己,当匹配自己组号的时候是不起作用的,因为你的分组还没有匹配到任何东西,分组信息是基于栈的形式,/((a)b(c))\1/比如第二个例子,第一组匹配的内容是abc,它会将abc压入到栈顶,当使用反向引用的时候它会从栈顶中获取到abc,其实第二个正则表达式匹配的则是abcabc

详细请参考我之前写的.net的正则表达式文章(原理是通的):浅析正则表达式-原理篇

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题