如何修改Swift正则表达式以验证澳大利亚电话号码?
解决澳大利亚电话号码验证的正则问题
嘿,我来帮你搞定这个问题!原正则确实是为北美(美国/加拿大)号码设计的,和澳大利亚号码的格式规则完全不匹配,所以咱们得先明确澳洲号码的核心规则,再针对性调整正则。
澳大利亚电话号码的核心格式规则
- 手机号码:国内格式为
04xxxxxxxx(10位,以04开头),国际格式为+614xxxxxxxx(去掉开头的0,替换为+61) - 固定电话:国内格式为
0[2|3|7|8]xxxxxxx(9位,区号是02/03/07/08),国际格式为+61[2|3|7|8]xxxxxxx - 允许的分隔符:空格、连字符
-、括号(),这些可以出现在任意合理位置(比如区号前后、号码段之间)
修改后的代码实现
我保留了你原有的扩展结构,把phone正则替换为适配澳洲号码的两个版本——一个是严格无分隔符的,一个是支持常见分隔符的,你可以按需选择:
extension String { enum RegularExpressions: String { // 基础版:仅匹配纯数字格式的澳洲号码 case auPhone = "^\\s*(?:\\+61|0)?(?:(?:4\\d{8})|(?:[2378]\\d{7}))\\s*$" // 增强版:支持空格、-、()等常见分隔符的澳洲号码 case auPhoneWithSeparators = "^\\s*(?:\\+61|0)?(?:\\s*[-.()]?\\s*(?:4\\d{2}\\s*[-.()]?\\s*\\d{3}\\s*[-.()]?\\s*\\d{3})|(?:[2378]\\d{2}\\s*[-.()]?\\s*\\d{3}\\s*[-.()]?\\s*\\d{3}))\\s*$" } func isValid(regex: RegularExpressions) -> Bool { let predicate = NSPredicate(format: "SELF MATCHES %@", regex.rawValue) return predicate.evaluate(with: self) } }
正则规则解释
基础版(无分隔符)
^\\s*:匹配开头的任意空白字符(允许号码前后有空格)(?:\\+61|0)?:可选的前缀——要么是国际国家代码+61,要么是国内的0(?:(?:4\\d{8})|(?:[2378]\\d{7})):核心号码部分,二选一:4\\d{8}:匹配手机号码(以4开头,后面跟8位数字,对应国内10位或国际9位的有效格式)[2378]\\d{7}:匹配固定电话(以2/3/7/8开头,后面跟7位数字,对应国内9位或国际8位的有效格式)
\\s*$:匹配结尾的任意空白字符
增强版(支持分隔符)
这个版本允许号码中插入空格、-、(、)这些常见的分隔符号,比如0412-345-678、(02) 1234 5678、+61 412 345 678这类格式都能正常匹配。
测试参考
你可以用这些例子验证效果:
- 有效号码:
0412345678、+61412345678、0212345678、+61212345678、0412 345 678、(02) 1234 5678 - 无效号码:
0123456789(非04开头的手机)、+1412345678(国家代码错误)、051234567(区号错误)
如果需要更严格的验证(比如强制分隔符位置、排除特殊号段),可以再根据具体需求微调正则,但上面的版本已经覆盖了绝大多数常见的澳洲号码场景。
内容的提问来源于stack exchange,提问作者Roggie
相关产品推荐
相关产品推荐

