不管有什么问题,ActionScript 和 JavaScript 应该总是产生相同的结果,因为它们都实现了 ECMAScript(或其超集,但对于正则表达式,它们不应该存在分歧)。
但是,是的,这将以任何语言(或者更确切地说任何正则表达式风格)发生。原因是您正在重复捕获组。让我们举一个更简单的例子:match (.)*
against abc
. 所以我们要重复的是(.)
。第一次尝试,引擎进入组,匹配a
,.
离开组并捕获a
。直到现在,量词才开始起作用,它重复了整个事情。于是我们再次进群,匹配捕获b
。此捕获覆盖前一个捕获,因此\1
现在包含b
. 第三次重复同样如此:捕获将被覆盖覆盖c
。
我不知道行为不同的正则表达式风格,唯一可以让您访问所有以前的捕获(而不是仅仅覆盖它们)的是.NET。
解决方案是建议的一个 pswg。使重复非捕获所需的分组(这将提高性能,因为无论如何您都不需要所有捕获和覆盖)并将整个事物包装在一个新组中。不过,您的表达式有一个小缺陷:您需要在否定字符类中包含反斜杠。否则,回溯可能会在[abc\]
. 因此,这是一个可以按预期工作的表达式:
\[((?:\\{2}|\\\]|[^\]\\])*)\]
工作演示。(不幸的是,它没有显示捕获,但它表明它在所有情况下都给出了正确的匹配)
请注意,您的表达式不允许其他转义序列。特别是单个\
, 后跟除 a 之外的任何内容]
都会导致您的模式失败。如果这不是您想要的,您可以使用:
\[((?:\\.|[^\]\\])*)\]
工作演示。
使用“展开循环”技术可以进一步提高性能:
\[([^\]\\]*(?:\\.[^\]\\]*)*)\]
工作演示。