如何在Swift中去除各类电话号码的区号并提取纯数字号码?
在Swift中提取电话号码的纯数字本地号码
这个需求很常见,我来给你一个能完美覆盖你列出的所有电话号码格式的Swift实现方案:
实现思路
我们可以通过两步完成目标:
- 先匹配并移除开头的国家区号前缀(覆盖你给出的美国+1、印度+91的所有变体形式)
- 再清理剩余字符串中的所有非数字字符,得到纯数字的本地号码
Swift代码实现
func extractLocalPhoneNumber(from input: String) -> String { // 匹配美国(+1/1/001)和印度(+91/91/0091/(+91))的国家区号前缀,含后续可选分隔符 let prefixPattern = #"^(\+1|001|1|\+91|0091|91|\(\+91\))[-\s)]?"# guard let prefixRegex = try? NSRegularExpression(pattern: prefixPattern, options: .caseInsensitive) else { // 正则初始化容错(固定写法不会触发,仅做兜底) return input.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() } // 移除匹配到的国家区号前缀 let stringWithoutPrefix = prefixRegex.stringByReplacingMatches( in: input, options: [], range: NSRange(location: 0, length: input.utf16.count), withTemplate: "" ) // 移除所有非数字字符,得到纯数字本地号码 let digitsOnly = stringWithoutPrefix.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() return digitsOnly }
测试验证
用你给出的所有号码测试这个函数:
let testNumbers = [ "+1-541-754-3010", "1-541-754-3010", "001-541-754-3010", "(541) 754-3010", "+91 5417543010", "+91-5417543010", "(+91)-5417543010" ] for number in testNumbers { let localNumber = extractLocalPhoneNumber(from: number) print("\(number) → \(localNumber)") }
输出结果
+1-541-754-3010 → 5417543010 1-541-754-3010 → 5417543010 001-541-754-3010 → 5417543010 (541) 754-3010 → 5417543010 +91 5417543010 → 5417543010 +91-5417543010 → 5417543010 (+91)-5417543010 → 5417543010
扩展说明
如果需要支持更多国家的区号,只需要扩展prefixPattern中的匹配项即可。比如要添加英国区号(+44/0044/44),只需要把正则修改为:
let prefixPattern = #"^(\+1|001|1|\+91|0091|91|\(\+91\)|\+44|0044|44)[-\s)]?"#
内容的提问来源于stack exchange,提问作者DIMPAL BHENDARKAR
相关产品推荐
相关产品推荐

