我正在研究雷吉高尔夫的奖金水平,目前我正在讨论模数问题。使用的regex引擎是“理论上说是ECMAScript,但浏览器实现各不相同,通常是按版本而定。”,我不知道我的浏览器(Firefox34.0)运行哪个版本。
基本上,我们的想法是匹配表单的表达式。
x* % x+ = x*其中重复的x's的数量代表数字。捕获的是只匹配有效的模运算。
到目前为止,我最好的解决办法如下:
^(?=x+ % (x+) )\1*(x*) % x+ = \2$也就是说,我使用前瞻性来获取第二组中的x数,尽可能多地匹配该模式,然后得到对剩余部分的反向引用,这必须是右侧的模式。
就这一点而言,它似乎起作用了,但在两种特定情况下(错误地匹配)却失败了:
xxxxx % xxxxx = xxxxx
xxxxxxxxxxxxxx % xxx = xxxxx这个特定regex高尔夫实现的一个很酷的特性是,它显示了字符串中正在匹配的部分。真正有趣的是,如果我去掉行尾绑定( $),两者的匹配区域将从行的开头到下面的^:
xxxxx % xxxxx = xxxxx
^
xxxxxxxxxxxxxx % xxx = xxxxx
^这正是我所怀疑的--第一个吞噬了整个第二个x组,所以\2最终是空的。在第二个过程中,真正的结果是2,所以\2是xx,这就是匹配的全部内容。但是当我加锚的时候,比赛就会跳到线的末尾。
我的表达式适用于以下几个方面:
xxxxxxxxxxxx % xx = x
xxxxx % xxx = xxxx其结果分别为0和2。
那怎么回事?在表达的逻辑上,我是否遗漏了一个基本的问题?
我知道发生了什么。regex引擎可以选择匹配\1模式的次数比它可能少,在这两种情况下,这都允许它扩展\2匹配,以便它等于rhs。想办法迫使它变得贪婪..。或者再往前看?欢迎提出建议。
发布于 2015-09-01 20:35:09
问题是,2美元可能与1美元以上的x相匹配。
您可以通过简单的负面展望来解决这个问题:(https://regex101.com/r/oY1mV7/1)
^(?=x+ % (x+) )\1*(?!\1)(x*) % x+ = \2$或(https://regex101.com/r/oY1mV7/2)
\b(x*)\1*(?!\1)(x+) % \1\b = \2\b另一个没有查找的选项是使用所有量量词,但在JavaScript:(https://regex101.com/r/oY1mV7/3)中根本不支持这一点。
\b(x*)\1*+(x+) % \1\b = \2\bhttps://stackoverflow.com/questions/32340233
复制相似问题