gpt4 book ai didi

Javascript 相同的正则表达式返回不同的结果

转载 作者:行者123 更新时间:2023-11-29 21:13:28 25 4
gpt4 key购买 nike

我有如下代码:

var regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/,
str = '+60123456789',
boo = 'false';

(!regexp.test(str)) ? boo = 'false' : boo = 'true';

console.log(boo);

我测试了代码,结果在这个 jsFiddle 上返回了 boo = 'true' 但在我的本地主机上返回了 boo = 'false'

这是为什么呢?我的正则表达式代码有什么问题吗?

编辑:

感谢 @Cerbrus@smnbbrv 指出我奇怪的三元语句。

我更正了它,但在 jsFiddle 和我的本地主机中仍然得到不同的结果。

var regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/,
str = '+60123456789',
boo = 'false';

boo = regexp.test(str) ? 'true' : 'false';

console.log(boo);

编辑 2:

之前的jsFiddle我搞错了。更正了 here 但仍然存在差异。

@Wiktor Stribiżew 的要求,我的正则表达式用于过滤数字。它应该接受任何以 +60 开头后跟任何两个数字或 0 后跟任何一个数字的数字。中间部分只是允许空格和连字符。

显然我还引起了 @Jaromanda X@Newbee Dev 之间的小争吵(我非常感谢他们的帮助!)。检查后我的 str 值是相同的。而 localhost 确实仍然显示不同的结果。

编辑 3:

@Joe:就此而言,我使用 Microsoft WebMatrix 3 运行我的本地主机。并且两个实例都使用相同的浏览器。

编辑 4:

感谢 @Joe 对我的正则表达式 here 的详细检查。但是,我这边的差异仍然存在。

根据他的建议更新了正则表达式。

regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,4})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/;
^

New jsFiddle here .

最佳答案

你的正则表达式有点歧义。

/((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/

如果我们一次分解一个部分:

((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))
将匹配 +60 后跟 2 个非零数字,或 0 后跟 1 个非零数字

((\s)|(\u002d)|(\s\u002d\s)?)
将匹配单个空格、单个破折号或被空格包围的破折号,或什么都不匹配。

(\d{3,})
然后匹配 3 个或更多数字 <- 这就是歧义所在。根据正则表达式匹配器的贪婪程度,如果只剩下数字,这可能会消耗到字符串的末尾。

((\s)|(\u002d)|(\s\u002d\s)?)
重复之前

(\d{3})
恰好匹配 3 个数字<- 如果先前的模式贪婪地匹配 到字符串的末尾,则此模式将不匹配,因为所有数字都已被消耗。

(\d)?
一个数字或没有数字

tl;dr
这个正则表达式是完全有效的,但会根据应用它的引擎的贪婪设置给出不同的结果。

关于Javascript 相同的正则表达式返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com