正则:一个表达式跟预期的结果不一样

发布于 2022-09-01 16:50:50 字数 343 浏览 12 评论 0

想用正则来判断一个字符串等式成立。
用来测试的式子是

/^(x+)(x+)+ % \2 = \1$/.test("xxxx % xx = x")

期望结果是false,但在三大浏览器上运行都是true。
一步步排除,发现如下奇怪结果

/^(x{1}){1}(x+){2} % \2 = \1$/.test("xxxx % xx = x")
true
/^(x{1}){1}(x{2}){2} % \2 = \1$/.test("xxxx % xx = x")
false

明明\2是xx,xx的n倍不可能是xxx。可是写成x+就可以

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一向肩并 2022-09-08 16:50:50

第一个(x+)和第二个(x+)配置的长度可能不一样,比如下面这句话的结果你能想到么?

"xxxx".replace(/^(x+)(x+)$/, "$1_$2")
// => xxx_x

可以看出来,两个 (x+) 都采用了贪婪匹配,第 1 个 (x+) 直接匹配了 3 个 x(因为得留一个给第 2 个 (x+) 匹配,不然就匹配不成功了)。

如果你想两个 (x+) 匹配一样的东西,那你的正则表达式应该改一下

/^(x+)(\1)+ % \2 = \1$/.test("xxxx % xx = x")
// false

/^(x+)(\1)+ % \2 = \1$/.test("xxxx % xx = xx")
// true
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文