正则表达式以匹配电话号码

时间:2017-07-10 22:31:03

标签: regex

我正在努力想出一个能使以下内容失效的正则表达式(电话号码)

  • 少于10个数字
  • 以+61开头的数字,但少于11个数字,不包括' +'登录
  • 以+61开头但超过11个数字的数字,不包括' +'登录
  • 以0061开头,但小于13的数字
  • 以0061开头但超过13个数字的号码
  • 以0061或+61之外的任何其他国家/地区代码开头的数字,但小于7个数字

到目前为止,我已经提出了

^((\+|00)\d{1,3}[- ]?)?\d{10}$

然而这失败了(没有发现以下内容)

  • 以+61开头但超过11个数字的数字,不包括' +'登录
  • 以+61开头但超过11个数字的数字,不包括' +'登录

请提供帮助

1 个答案:

答案 0 :(得分:0)

如果您的电话号码不能包含空格(正如您的正则表达式所示),则回溯似乎是您的问题。

考虑你的正则表达式的这一部分:(\d{1,3}[- ]?)?\d

这里的东西是可选的破折号/空格字符串。如果匹配不匹配,您最终会得到一个连续数字列表。当引擎想要找到匹配项时,它会将部分国家/地区代码视为电话号码,反之亦然。

示例(空格要区分):+1 23456789012也可以写为+123 456789012。根据你的正则表达式,两者都匹配,但你可能只想获得第一个电话号码的匹配。

更新1

此正则表达式根据您的标准列表验证电话号码:

^(?:(?:\+61[- ]?\d{9}|0061[- ]?\d{9})|(?:\+|00)(?!(61))\d{1,6})$

它基本上有两个部分:

  • (?:\+61[- ]?\d{9}|0061[- ]?\d{9})验证点1,2,3,4,5
  • (?:\+|00)(?!(61))\d{1,6})验证第6点

请记住,整数的长度取决于country code

示例:https://regex101.com/r/23BWKz/3