Javascript 使用反向引用简化正则表达式

Javascript 使用反向引用简化正则表达式,javascript,regex,backreference,Javascript,Regex,Backreference,以ECMAScript正则表达式为例 /\s*((ABC|A)(/(ABC|A)+)*)\s*/i 哪个和A/ABC匹配 使用反向引用,我试图通过将其重写为 /\s*((ABC|A)(/\2+)*)\s*/i 但这似乎只与A/A匹配 为什么我会经历这种行为?我可以在这里使用backreference来简化正则表达式吗?(我在上在线测试它)发生这种情况的原因是因为您拥有的新正则表达式将只A/A或A/AA或A/AAA,(在/)之后的任意数量的A)。(从技术上讲,它也将匹配ABC/ABC,或ABC

以ECMAScript正则表达式为例

/\s*((ABC|A)(/(ABC|A)+)*)\s*/i
哪个和A/ABC匹配

使用反向引用,我试图通过将其重写为

/\s*((ABC|A)(/\2+)*)\s*/i
但这似乎只与A/A匹配


为什么我会经历这种行为?我可以在这里使用backreference来简化正则表达式吗?(我在上在线测试它)

发生这种情况的原因是因为您拥有的新正则表达式将只
A/A
A/AA
A/AAA
,(在/)之后的任意数量的A)。(从技术上讲,它也将匹配
ABC/ABC
,或
ABC/ABCABC

您的
(/\2+)
捕获组后的
*
(/\2+)
捕获组中的任意数量匹配。因此,除非你不关心
A/A
(即
A/AFOO
)后面的内容,否则你可以做
/\s*((ABC | A)(/\2+).*)\s*/i
匹配
A/A(无论在这里是什么)
,(即
A/ABC
A/ADC
A/Afoobar


否则,我建议使用原始正则表达式。

反向引用并不意味着匹配相同的模式,而是匹配相同的匹配字符串。你说得太对了,Gumbo!我在阅读反向参考资料时误解了这一点!在某个网站上,我发现下面这句话解释了这一切:“反向引用匹配的文本与之前捕获组匹配的文本相同。”这当然就是为什么我只匹配a/a!所以我现在的问题似乎变成了“如果有一个捕获组出现在你的正则表达式的多个地方,有没有办法让你的正则表达式变短?”?