澳大利亚电话号码验证的正则表达式

17
我尝试了以下的手机号码验证正则表达式,但是并没有有效地工作。
^([+61|0](2|4|3|7|8|)){0,2}([ 0-9]|[(]){2,3}([)]|[0-9]){6}([ ])[0-9]{7,20}$

这里是我期望通过验证的示例

+61(02)89876544
+61 2 8986 6544
02 8986 6544
+61289876544
0414 570776 
0414570776
0414 570 776
+61 414 570776
+61 (0)414 570776

以下字符也将被接受:()-+空格


2
“+61(02)89876544”和“+61 (0)414 570776”不是无效的吗?如果包括“+61”,难道不应该从区号中去掉“0”吗? - nnnnnn
5个回答

39

这是一个相当复杂的电话号码结构。最简单的解决方案是要求用户按特定格式输入,或者让表单自动进行格式化。如果必须使用正则表达式,我想到的是:

^(?:\+?(61))? ?(?:\((?=.*\)))?(0?[2-57-8])\)? ?(\d\d(?:[- ](?=\d{3})|(?!\d\d[- ]?\d[- ]))\d\d[- ]?\d[- ]?\d{3})$

捕获组:

  1. 国家代码(可选)
  2. 地区/供应商代码(可选)
  3. 电话号码

演示:https://regex101.com/r/dkFASs/6

这是我用来确定格式的方法:https://en.wikipedia.org/wiki/Telephone_numbers_in_Australia

当处理像这样的较大正则表达式时,我发现最简单的方法是将您的测试用例放入类似 regex101.com 的工具中,然后逐个捕获组(如果可能,给它们命名),直到完成。一旦一个组不匹配,就改变已有的内容直到匹配为止。

编辑于2019年:由于这个问题偶尔还会引起注意,我想指出,如果可能的话最好使用验证库。我的建议是 Google的电话号码i18n库。它比正则表达式更加强大。


看起来不错,我还得设置字符限制,最小为7个字符,最大为20个字符。 - KRR
你的意思是什么?这个正则表达式将匹配恰好8位数字,其中包括可选的区号(可选的零后跟1、2、3、4、5、7或8)和可选的国家代码(可选的+然后是64)。如果正则表达式长度超过20个字符,那么要么是因为内部有空格或破折号,要么就是末尾有多余的空格。编辑:我希望你不是指正则表达式的长度必须小于20个字符... - 3ocene
电话号码长度应为7到20位,模式错误显示在https://regex101.com的javascript模式中。 - KRR
@KRR,这个答案似乎时不时地会引起一些关注。如果它解决了你的问题,请将其标记为接受的答案;如果没有,那请详细说明您的问题,以便我能更好地回答它。(或者如果您认为其他答案更好,请将其标记为接受的答案)。 - 3ocene
@JustinMitchell 当然可以,但(在我看来)问题是要验证它是否符合澳大利亚的标准格式,而不是验证它是否为10位数字。如果用户在数字之间随意添加空格,则不符合标准格式。 - 3ocene
显示剩余3条评论

9

我给@3ocene的回答点了赞,但后来发现并不完全适用于我的情况。

这是我的测试用例(非详尽):

+(61) 455 562 400
+61-455-562-400
+61 455 562 400
+(61)-455-562-400
+(61) 455 562 400
(02) 4371 3164
(02) 4371-3164
02 80268989
03 80268989
04 80268989
05 80268989
433245898
433 245 898
433-245-898
4555-62400
123456
08 54 587 456

123456是负数。

这是我建立的东西,如果有人需要,这里就是它:

^(\+?\(61\)|\(\+?61\)|\+?61|\(0[1-9]\)|0[1-9])?( ?-?[0-9]){7,9}$

这是Regexer链接:

https://regex101.com/r/eiufOH/2


4

我建议先从电话号码中删除所有空格,因为更多的模式会意味着更复杂的正则表达式,然后应用以下内容:

(?:\+?61)?(?:\(0\)[23478]|\(?0?[23478]\)?)\d{8}

据我所知,它是有效的。稍后将写出解释。

1
尝试这个。
\b([\+-]?\d{2}|\d{4})\s*\(?\d+\)?\s*(?:\d+\s*)+\b

1

修改3ocene以包括13、180、19、1300、1800、1900

13 xxxx和1300 xxx xxx - “本地费率”通话,不包括VoIP和移动电话用户

180 xxxx和1800 xxx xxx - 免费通话

19 xxxx和19xx xxxx - 高级短信

^(?=.*)((?:\+61) ?(?:\((?=.*\)))?([2-47-8])\)?|(?:\((?=.*\)))?([0-1][2-47-8])\)?) ?-?(?=.*)((\d{1} ?-?\d{3}$)|(00 ?-?\d{4} ?-?\d{4}$)|( ?-?\d{4} ?-?\d{4}$)|(\d{2} ?-?\d{3} ?-?\d{3}$))

https://regex101.com/r/dqsaHM/3

我还发现了这个链接,可以使用流程图来帮助编辑正则表达式,希望它能有所帮助。

https://ihateregex.io/expr/phone/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接