阿根廷手机号码正则表达式验证

5
我研究了一下我国电话号码的正则表达式,但是有些内容还没有解决。
这里的规则是:(区号)前缀-后缀
  • 区号可以是3到5位数字
  • 前缀可以是2到4位数字。
  • 区号+前缀共7位数字。
  • 后缀始终为4位数字。
  • 总共11位数字。
我想我可以用3个简单的正则表达式连接起来,用OR "|"这样的符号连接起来,像这样:
/(\(?\d{3}\)?[- .]?\d{4}[- .]?\d\d\d\d)|(\(?\d{4}\)?[- .]?\d{3}[- .]?\d\d\d\d)|(\(?\d{5}\)?[- .]?\d{2}[- .]?\d\d\d\d)/

我做错的事情是,\d\d\d\d 不仅匹配后缀的 4 个数字,例如:(011) 4740-5000 是一个有效的电话号码,并且正常工作,但如果添加额外数字它也会返回为有效的电话号码,例如:(011) 4740-5000000000。

3
三个模式中似乎都重复使用了常见后缀\d\d\d\d。而aX|bX|cX其实可以简化为(a|b|c)X。另外,为什么要使用\d\d\d\d而不是\d{4} - MSalters
1
真正的问题是电话号码从来不会这么简单。维基百科:阿根廷电话号码 你确定你想这么严格吗? - nmclean
相关(西班牙语SO):*使用正则表达式验证阿根廷电话号码*。 - Mariano
5个回答

3

你应该使用 ^$ 来匹配整个字符串。

例如,^\d{4}$ 可以精确匹配4位数字,不多也不少。

这是完整的正则表达式模式。

^((\(?\d{3}\)? \d{4})|(\(?\d{4}\)? \d{3})|(\(?\d{5}\)? \d{2}))-\d{4}$

在线演示


根据您的正则表达式模式,分隔符可以是 -. 或单个空格,请尝试

^((\(?\d{3}\)?[-. ]?\d{4})|(\(?\d{4}\)?[-. ]?\d{3})|(\(?\d{5}\)?[-. ]?\d{2}))[-. ]?\d{4}$

1
这个模式对我来说很好用:


/^\\(?(\d{3,5})?\\)?\s?(15)?[\s|-]?(4)\d{2,3}[\s|-]?\d{4}$/

谢谢你的努力。原始发帖人很久没有在 Stack Overflow 上线了,因此我会在不进行调查的情况下为您的回答点赞。欢迎来到 Stack Overflow。 - revo

0

你需要通过使用锚点指定起始和结束位置来匹配完整的表达式。此外,您无需使用不同长度的替代。

/^(?=(\D*\d){11}$)\(?\d{3,5}\)?[- .]?\d{2,4}[- .]?\d{4}$/

以下是细节分解:

(?=(\D*\d){11}$)    is a non-capturing group ensuring that there are 11 digits total,
                     with any number of non-digits amongst them
\(?\d{3,5}\)?[- .]? matches 3-5 digits in parens (area code), followed by a separator
\d{2,4}[- .]?       matches 2-4 digits (prefix), followed by a separator
\d{4}               matches the suffix

这很聪明,但我认为你在(区号)的可选括号(用于你的前瞻)中会遇到问题。最终可能仍需要使用一些| - ohaal
哎呀 - 我没注意到括号是可选的。嗯。 - Brian Stephens
@ohaal:好的,我已经编辑了答案以适应括号是否存在。 - Brian Stephens

0
我已在regex101中进行了测试:
/^((?:\(?\d{3}\)?[- .]?\d{4}|\(?\d{4}\)?[- .]?\d{3}|\(?\d{5}\)?[- .]?\d{2})[- .]?\d{4})$/

正则表达式演示

  • ^ 匹配字符串的开头
    • ( 开始捕获组
      • (?: 开始非捕获组
        • 区号和前缀的不同选项
      • ) 结束非捕获组
      • [- .]?\d{4} 电话号码的最后四位数字
    • ) 结束捕获组
  • $ 匹配字符串的结尾

0

如果您要验证此类电话号码,则以下号码应符合您的要求:

^(?=.{15}$)[(]\d{3,5}[)] \d{2,4}-\d{4}$

Regular expression visualization

Debuggex演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接