首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex Modulus故障

Regex Modulus故障
EN

Stack Overflow用户
提问于 2015-09-01 20:21:07
回答 1查看 236关注 0票数 4

我正在研究雷吉高尔夫的奖金水平,目前我正在讨论模数问题。使用的regex引擎是“理论上说是ECMAScript,但浏览器实现各不相同,通常是按版本而定。”,我不知道我的浏览器(Firefox34.0)运行哪个版本。

基本上,我们的想法是匹配表单的表达式。

代码语言:javascript
复制
x* % x+ = x*

其中重复的x's的数量代表数字。捕获的是只匹配有效的模运算。

到目前为止,我最好的解决办法如下:

代码语言:javascript
复制
^(?=x+ % (x+) )\1*(x*) % x+ = \2$

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

就这一点而言,它似乎起作用了,但在两种特定情况下(错误地匹配)却失败了:

代码语言:javascript
复制
xxxxx % xxxxx = xxxxx
xxxxxxxxxxxxxx % xxx = xxxxx

这个特定regex高尔夫实现的一个很酷的特性是,它显示了字符串中正在匹配的部分。真正有趣的是,如果我去掉行尾绑定( $),两者的匹配区域将从行的开头到下面的^

代码语言:javascript
复制
xxxxx % xxxxx = xxxxx
               ^
xxxxxxxxxxxxxx % xxx = xxxxx
                        ^

这正是我所怀疑的--第一个吞噬了整个第二个x组,所以\2最终是空的。在第二个过程中,真正的结果是2,所以\2xx,这就是匹配的全部内容。但是当我加锚的时候,比赛就会跳到线的末尾。

我的表达式适用于以下几个方面:

代码语言:javascript
复制
xxxxxxxxxxxx % xx = x
xxxxx % xxx = xxxx

其结果分别为0和2。

那怎么回事?在表达的逻辑上,我是否遗漏了一个基本的问题?

我知道发生了什么。regex引擎可以选择匹配\1模式的次数比它可能少,在这两种情况下,这都允许它扩展\2匹配,以便它等于rhs。想办法迫使它变得贪婪..。或者再往前看?欢迎提出建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-01 20:35:09

问题是,2美元可能与1美元以上的x相匹配。

您可以通过简单的负面展望来解决这个问题:(https://regex101.com/r/oY1mV7/1)

代码语言:javascript
复制
^(?=x+ % (x+) )\1*(?!\1)(x*) % x+ = \2$

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

代码语言:javascript
复制
\b(x*)\1*(?!\1)(x+) % \1\b = \2\b

另一个没有查找的选项是使用所有量量词,但在JavaScript:(https://regex101.com/r/oY1mV7/3)中根本不支持这一点。

代码语言:javascript
复制
\b(x*)\1*+(x+) % \1\b = \2\b
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32340233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档