Javascript 委内瑞拉电话号码的正则表达式与预期不匹配

Javascript 委内瑞拉电话号码的正则表达式与预期不匹配,javascript,regex,Javascript,Regex,我有两个正则表达式: Local Numbers: /^0058|\+58(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789]))\d{7}$/ Mobile Numbers: /^0058|\+58(?:4(?:1[246]|2[46]))\d{7}$/ 这个想法是为了验证委内瑞拉的电话号码是否添加了该国的前缀。现在,这样的值是有效的: 00584129999999 04129999999 04249999999 00

我有两个正则表达式:

Local Numbers: /^0058|\+58(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789]))\d{7}$/
Mobile Numbers: /^0058|\+58(?:4(?:1[246]|2[46]))\d{7}$/
这个想法是为了验证委内瑞拉的电话号码是否添加了该国的前缀。现在,这样的值是有效的:

00584129999999
04129999999
04249999999
00584249999999
02129999999
00582129999999  
但价值观是这样的:

+584129999999
+582129999999

你不是。我找不到我犯错误的地方,所以有什么建议吗?

交替运算符的范围比您想象的要大。你的第一个正则表达式分为

^0058
|
\+58(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789]))\d{7}$
此外,还应允许使用单个
0
(而不是强制使用
+58
0058

你可能想要像这样的东西

^(?:(?:00|\+)58|0)(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789]))\d{7}$
如果要将两个正则表达式合并为一个正则表达式,没有问题:

^(?:(?:00|\+)58|0)(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789])|4(?:1[246]|2[46]))\d{7}$

测试它。

@ReynierPM:当你用本地号码regex测试手机号码时,你期待什么?它应该会失败,是的,它可以工作。我没有注意到我用本地regex测试手机的那一部分,我不好,不管怎样,有没有改变将两个表达式混合在一个中?还是太复杂了?@ReynierPM:没问题(当时我正在开会,所以不能马上回答)。如果你能稍后回答,别担心,我会很乐意为你提供帮助。