为国际电话号码定制RegExp

时间:2015-06-08 14:06:12

标签: regex

我有这个与大多数电话号码匹配的正则表达式:

^((\+|00)[1-9]{1,3})?(\-| {0,1})?(([\d]{0,3})(\-| {0,1})?([\d]{5,11})){1}$

电话号码很好:

  • 39123456789
  • + 39-123-456789
  • +39 123 456789

空格,连字符和无空格的组合,如:

  • +39 123456789
  • + 39-123 456789

现在,我需要两件事:

  1. 也允许点作为分隔符,如下所示:
    • +39.123.456789
    • +39 123.456789
    • + 39-123.456789
  2. 不允许在数字之间使用多个分隔符。目前,正则表达式允许格式不正确的字符串,例如:

    • + 39-123456789

1 个答案:

答案 0 :(得分:1)

只是修复你的正则表达式,我可以建议以下正则表达式:

^(?![^ .-]*[ .-]{2})((\+|00)[1-9]{1,3})?[ .-]?((\d{0,3})[ .-]?(\d{5,11}))$

这是demo

<强>说明

  • ^ - 字符串开头
  • (?![^ .-]*[ .-]{2}) - 确保没有后续的分隔符
  • ((\+|00)[1-9]{1,3})? - 前缀+00以及1-9范围内的1或3位数字
  • [ .-]? - Optinal separator
  • ((\d{0,3})[ .-]?(\d{5,11})) - 0到3位数后跟一个可选的分隔符,然后是5到11位
  • $ - 字符串结束。

如果你没有在这里使用捕获组,只需删除它们或进行非捕获:

^(?![^ .-]*[ .-]{2})(?:(?:\+|00)[1-9]{1,3})?[ .-]?\d{0,3}[ .-]?\d{5,11}$

遵循您的逻辑,我们可以进一步优化此模式

^(?:\+|00)[1-9]{1,3}[. -]?[0-9]{3}[. -]?[0-9]{5,11}$

评论中是improved version suggested by @Falt4rm