^([+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
以下字符也将被接受:()-+空格
^([+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
以下字符也将被接受:()-+空格
这是一个相当复杂的电话号码结构。最简单的解决方案是要求用户按特定格式输入,或者让表单自动进行格式化。如果必须使用正则表达式,我想到的是:
^(?:\+?(61))? ?(?:\((?=.*\)))?(0?[2-57-8])\)? ?(\d\d(?:[- ](?=\d{3})|(?!\d\d[- ]?\d[- ]))\d\d[- ]?\d[- ]?\d{3})$
捕获组:
演示:https://regex101.com/r/dkFASs/6
这是我用来确定格式的方法:https://en.wikipedia.org/wiki/Telephone_numbers_in_Australia
当处理像这样的较大正则表达式时,我发现最简单的方法是将您的测试用例放入类似 regex101.com 的工具中,然后逐个捕获组(如果可能,给它们命名),直到完成。一旦一个组不匹配,就改变已有的内容直到匹配为止。
编辑于2019年:由于这个问题偶尔还会引起注意,我想指出,如果可能的话最好使用验证库。我的建议是 Google的电话号码i18n库。它比正则表达式更加强大。
我给@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链接:
我建议先从电话号码中删除所有空格,因为更多的模式会意味着更复杂的正则表达式,然后应用以下内容:
(?:\+?61)?(?:\(0\)[23478]|\(?0?[23478]\)?)\d{8}
\b([\+-]?\d{2}|\d{4})\s*\(?\d+\)?\s*(?:\d+\s*)+\b
修改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
我还发现了这个链接,可以使用流程图来帮助编辑正则表达式,希望它能有所帮助。