Javascript 静态捕获组?

Javascript 静态捕获组?,javascript,regex,Javascript,Regex,假设我们有以下正则表达式: ((a(.+?)c ?)+) 这将匹配: abc acc aac 我想做的是: ((a(.+?)c ?)(a\3c ?)*) 所以我只会比赛 abc abc abc 或 但不是第2项(abc acc aac) 。。。但是没有反向参考 基本上,我希望#1(+?)中的第三个捕获组始终匹配第一场比赛的任何内容 这可能吗 为了让事情变得更复杂,这需要在JavaScript的regexp引擎中工作。如果尾随空间发生变化,则无法捕获尾随空间,因为记忆的值将在后面的参考文献

假设我们有以下正则表达式:

((a(.+?)c ?)+)
这将匹配:

abc acc aac
我想做的是:

((a(.+?)c ?)(a\3c ?)*)
所以我只会比赛

abc abc abc

但不是第2项(abc acc aac)

。。。但是没有反向参考

基本上,我希望#1(+?)中的第三个捕获组始终匹配第一场比赛的任何内容

这可能吗


为了让事情变得更复杂,这需要在JavaScript的regexp引擎中工作。

如果尾随空间发生变化,则无法捕获尾随空间,因为记忆的值将在后面的参考文献中进行逐字比较。将变量移到捕捉参数之外使其变得简单:

var rx= /(a(.+?)c) ?\1 ?\1/g ;

// tests/demo
"abc abc abc".match(rx) // ["abc abc abc"]
"abc acc abc".match(rx) // null
"abc acc aac".match(rx) // null
"acc acc acc".match(rx) // ["acc acc acc"]

因此,允许可选空格只需要几个额外的重复字符,但它是有效的。

您想要一个没有反向引用的正则表达式吗?因为它似乎是您所需要的:
((a(+?)c?)(a(+?)c?)(a\3c?*)
是的,js支持反向引用和它所基于的大多数其他perl regexp功能…@dandavis刚刚测试过,我不知道这一点!我一直认为它在JavaScript中不起作用。现在,您为我打开了一个全新的RegExp世界(并不是说我实际上在字符串操作中使用它太多),我知道在JS的引擎中使用反向引用是可能的,但这正是我想要避免的。它迫使你在你的正则表达式中加入多余的子表达式,为了可读性,最好去掉它。RegExp和readable永远不应该用在同一个句子中…我希望找到一些没有反向引用的东西。根据你的例子,我不确定我是否理解。您想为“abc”硬编码一个不同于“abc acc abc”的RegExp吗?列出几个组合并涵盖所有组合需要很多RegExp对象……第二个RegExp完全符合我的要求,但我想知道是否可以不使用反向引用来实现。它还应该与“adc”或“axc axc axc”匹配——但中间字符(无论是什么)在每次重复中都需要相同。我还应该注意,这不是我试图构造的确切regexp,而是它的简化版本。
var rx= /(a(.+?)c) ?\1 ?\1/g ;

// tests/demo
"abc abc abc".match(rx) // ["abc abc abc"]
"abc acc abc".match(rx) // null
"abc acc aac".match(rx) // null
"acc acc acc".match(rx) // ["acc acc acc"]