目前,我正在循环使用电话号码以在数据库中查找匹配项。但是,我需要删除破折号和任何区号,以便数据库搜索可以精确。目前,我正在尝试在电话号码上使用此正则表达式:
(?:+d{2}s*(?:(d{2}))|(?:(d{2})))?s*(d{4,5}-?d{4})
我正在尝试这样应用它
if let longNumber = (contact.phoneNumbers.first?.value as? CNPhoneNumber)?.stringValue {
let phoneNumber = longNumber.replacingOccurrences(of: "(?:+d{2}s*(?:(d{2}))|(?:(d{2})))?s*(d{4,5}-?d{4})", with: "$1", options: .regularExpression)
但是,我收到错误Invalid escape sequence in literal
并Missing argument for parameter 'for' in call
如何正确仅从字符串中获取电话数字? 即如果是 +1 300-300-3000
我需要它返回3003003000。
例子:
+1 390 - 456 - 8823 -> 3904568823
+92084 765 4902 --> 0847654902
+922 (064( 864 0921 --> 0648640921
842.231.9072 --> 8422319072
+1 (972( - 864 - 0921 --> 9728640921
+92 33 - 783 - 9382 --> 337839282
从您展示的示例中,我假设以下规则:
电话号码的格式为 3 或 4 部分
第 1 部分(可选(
+
- 1 到 3 位数字
- 后面跟着一个或多个空格
第 2 部分
- 可封闭在
(
和)
中 - 2 或 3 位数字
- 后面是连字符或小数点或两端有额外空格的空格
第 3 部分
- 3 位数字
- 后面是连字符或小数点或两端有额外空格的空格
第四部分
- 4 位数字
(请记住,这种电话号码表示法规则是特定区域的本地规则。当你想要国际化你的应用时,你可能需要更多规则。您现在拥有的模式可能是为其他区域编写的。
每个部分的部分模式如下所示:
let part1 = "(?:\+\d{1,3}\s+)?"
let part2 = "(?:\((\d{2,3})\)|(\d{2,3}))\s*[\s\.-]?\s*"
let part3 = "(\d{3})\s*[\s\.-]?\s*"
let part4 = "(\d{4})"
(请不要错过所有反斜杠都被转义。
测试代码:
import Foundation
let numbers: [(long: String, expected: String)] = [
("+1 300-300-3000", "3003003000"),
("+1 390 - 456 - 8823", "3904568823"),
("+92 084 765 4902", "0847654902"),
("+922 (064) 864 0921", "0648640921"),
("842.231.9072", "8422319072"),
("+1 (972) - 864 - 0921", "9728640921"),
("+92 33 - 783 - 9382", "337839382"), //I assume your example is wrong here
]
for number in numbers {
let longNumber = number.long
let part1 = "(?:\+\d{1,3}\s+)?"
let part2 = "(?:\((\d{2,3})\)|(\d{2,3}))\s*[\s\.-]?\s*"
let part3 = "(\d{3})\s*[\s\.-]?\s*"
let part4 = "(\d{4})"
let pattern = "^(part1)(part2)(part3)(part4)$"
let phoneNumber = longNumber.replacingOccurrences(of: pattern, with: "$1$2$3$4", options: .regularExpression)
print("(longNumber) --> (phoneNumber)", phoneNumber == number.expected ? "Success" : "Fail (expected (number.expected))")
}
输出:
+1 300-300-3000 --> 3003003000 Success +1 390 - 456 - 8823 --> 3904568823 Success +92 084 765 4902 --> 0847654902 Success +922 (064) 864 0921 --> 0648640921 Success 842.231.9072 --> 8422319072 Success +1 (972) - 864 - 0921 --> 9728640921 Success +92 33 - 783 - 9382 --> 337839382 Success
对于可能的其他输入,上面的代码可能无法按预期工作,请尝试自行修复它以适应此类输入。