为电话号码编写正则表达式
我想编写一个正则表达式来匹配以下格式的电话号码,即
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}$
一旦我在 + 号后面加上 () 和 - 我的正则表达式停止工作。
我该如何解决?我不是正则表达式专家,而是通过尝试通过谷歌搜索获得的不同模式来组装我的正则表达式。
任何帮助,将不胜感激。
回答
编辑:由于 OP 添加了与 + 号匹配的电话号码样本,因此现在添加以下答案。
^(?:d{10})?(?:+)?(?:(?:d{11})?(?:d(d{3}))?(?:(?:d{7})?(?:-d{3}-d{4})?))$
这是上述正则表达式的在线演示
使用您显示的样本,您能否尝试以下操作。
^+(?:(?:d{11})?(?:d(d{3}))?(?:(?:d{7})?(?:-d{3}-d{4})?))$
这是上述正则表达式的在线演示
说明:为以上添加详细说明。
^+ ##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.
回答
这是我对你的问题的两分钱。看起来以下内容也打勾:
^(?:+d(?:(d{3})(?:-d{3}-|d{3})|d{6})|d{6})d{4}$
查看在线演示
^- 起点线锚。(?:- 打开第一个非捕获组:+d- 一个文字“+”和一个数字。(?:- 打开第二个非捕获组:(d{3})- 在开头和结尾的括号之间匹配三位数字。(?:- 打开第三个非捕获组:-d{3}-- 破折号之间的三位数字。|- 或者:d{3})- 在关闭第三个非捕获组之前仅三位数。
|- 或者:d{6})- 在关闭第二个非捕获组之前仅六位数。
|- 或者:d{6})- 或者在关闭第一个非捕获组之前仅六位数。
d{4}- 四位数。$- 结束线锚。
向模式添加一个可选数字以允许 2 位国家代码,例如:
^(?:+dd?(?:(d{3})(?:-d{3}-|d{3})|d{6})|d{6})d{4}$