正则表达式模数故障?

Regex Modulus malfunction?

我正在研究 regex golf, and I'm currently on the modulus problem. The regex engine used is "theoretically ECMAScript, but browser implementations vary, often by version." 的奖励级别 我不知道我的浏览器 (Firefox 34.0) 运行哪个版本。

基本上,我们的想法是匹配以下形式的表达式

x* % x+ = x*

其中重复的数量 x 代表数字。问题是只匹配有效的模运算。

目前我最好的解决方案如下:

^(?=x+ % (x+) )*(x*) % x+ = $

也就是说,我使用前瞻来获取第二组中 x 的数量,尽可能多地匹配该模式,然后获得对剩余部分的反向引用,该剩余部分必须是右侧的图案。

就目前而言,它似乎可以工作,但在两种特定情况下会失败(错误匹配):

xxxxx % xxxxx = xxxxx
xxxxxxxxxxxxxx % xxx = xxxxx

该特定正则表达式 golf 实现的一个很酷的功能是它向您显示正在匹配的字符串部分。真正有趣的是,如果我取消行尾绑定($),两者的匹配区域将从行首到下面的 ^

xxxxx % xxxxx = xxxxx
               ^
xxxxxxxxxxxxxx % xxx = xxxxx
                        ^

这正是我所怀疑的——第一个吞噬了整个第二个 x 组,所以 </code> 最终是空的。在第二个中,实际结果是 2,所以 <code>xx,这就是所有匹配的结果。但是当我添加锚点时,匹配项跳到行尾。

我的表达适用于这些:

xxxxxxxxxxxx % xx = x
xxxxx % xxx = xxxx

其中结果也分别为 0 和 2。

所以怎么了?我是否遗漏了表达逻辑中的一个基本问题?


我明白是怎么回事了。正则表达式引擎可以选择匹配 </code> 模式的次数比它可能匹配的次数少,在这两种情况下,这都允许它扩展 <code> 匹配,使其等于 rhs。现在想办法让它变得非常贪婪……也许是另一个前瞻?欢迎指教。

问题是 $2 可能匹配超过 $1 xs。

你可以用一个简单的否定前瞻来解决它:(https://regex101.com/r/oY1mV7/1)

^(?=x+ % (x+) )*(?!)(x*) % x+ = $

或 (https://regex101.com/r/oY1mV7/2)

\b(x*)*(?!)(x+) % \b = \b

另一个没有环视的选项是使用 possessive quantifier, but that is not supported at all in JavaScript: (https://regex101.com/r/oY1mV7/3)

\b(x*)*+(x+) % \b = \b