Javascript 使用反向引用简化正则表达式
以ECMAScript正则表达式为例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
/\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!所以我现在的问题似乎变成了“如果有一个捕获组出现在你的正则表达式的多个地方,有没有办法让你的正则表达式变短?”?