为电话号码编写正则表达式

Sid*_*mar 2 regex

我想编写一个正则表达式来匹配以下格式的电话号码,即

1- 没有国家代码 9999999999

2 - 带 1 位国家代码 +19999999999

3 - 带国家代码和 () +1(999)9999999

4 - 国家代码 () 和 - +1(999)-999-9999

我写了一个匹配条件 2 但在 1,3 和 4 中失败的正则表达式。

^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$
Run Code Online (Sandbox Code Playgroud)

一旦我在 + 号后面加上 () 和 - 我的正则表达式停止工作。

我该如何解决?我不是正则表达式专家,而是通过尝试通过谷歌搜索获得的不同模式来组装我的正则表达式。

任何帮助,将不胜感激。

Rav*_*h13 7

编辑:由于 OP 添加了与 + 号匹配的电话号码样本,因此现在添加以下答案。

^(?:\d{10})?(?:\+)?(?:(?:\d{11})?(?:\d\(\d{3}\))?(?:(?:\d{7})?(?:-\d{3}-\d{4})?))$
Run Code Online (Sandbox Code Playgroud)

这是上述正则表达式的在线演示



使用您显示的样本,您能否尝试以下操作。

^\+(?:(?:\d{11})?(?:\d\(\d{3}\))?(?:(?:\d{7})?(?:-\d{3}-\d{4})?))$
Run Code Online (Sandbox Code Playgroud)

这是上述正则表达式的在线演示

说明:为以上添加详细说明。

^\+                        ##Checking if starting is from + sign.
(?:                        ##Starting a non-capturing group from here.
   (?:\d{11})?             ##Starting a non-capturing group which matches 11 digits here, keeping it optional.
   (?:\d\(\d{3}\))?        ##Starting a non-capturing group which matches single digit followed by ( 3 digits followed by ) and keeping this optional too.
   (?:                     ##Starting a non-capturing group here.
     (?:\d{7})?            ##Starting a non-capturing group here with 7 digits keeping it optional.
     (?:-\d{3}-\d{4})?     ##Starting a non-capturing group which has - 3 digits - 4 digits keep it optional.
   )                       ##Closing above non-capturing group here.
)$                         ##Closing very first non-capturing group here.
Run Code Online (Sandbox Code Playgroud)


Jvd*_*vdV 5

这是我对你的问题的两分钱。看起来以下内容也打勾:

^(?:\+\d(?:\(\d{3}\)(?:-\d{3}-|\d{3})|\d{6})|\d{6})\d{4}$
Run Code Online (Sandbox Code Playgroud)

查看在线演示

  • ^ - 起点线锚。
  • (?: - 打开第一个非捕获组:
    • \+\d - 一个文字“+”和一个数字。
    • (?: - 打开第二个非捕获组:
      • \(\d{3}\) - 在开头和结尾的括号之间匹配三位数字。
      • (?: - 打开第三个非捕获组:
        • -\d{3}- - 破折号之间的三位数字。
        • | - 或者:
        • \d{3}) - 在关闭第三个非捕获组之前仅三位数。
      • | - 或者:
      • \d{6}) - 在关闭第二个非捕获组之前仅六位数。
    • | - 或者:
    • \d{6}) - 或者在关闭第一个非捕获组之前仅六位数。
  • \d{4} - 四位数。
  • $ - 结束线锚。

向模式添加一个可选数字以允许 2 位国家代码,例如:

^(?:\+\d\d?(?:\(\d{3}\)(?:-\d{3}-|\d{3})|\d{6})|\d{6})\d{4}$
Run Code Online (Sandbox Code Playgroud)