我想编写一个正则表达式来匹配以下格式的电话号码,即
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)
一旦我在 + 号后面加上 () 和 - 我的正则表达式停止工作。
我该如何解决?我不是正则表达式专家,而是通过尝试通过谷歌搜索获得的不同模式来组装我的正则表达式。
任何帮助,将不胜感激。
编辑:由于 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)
这是我对你的问题的两分钱。看起来以下内容也打勾:
^(?:\+\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)