You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:45