目前,我正在遍历电话号码以在数据库中查找匹配项。但是,我需要删除破折号和任何区号,以便数据库搜索准确无误。目前,我正在尝试在电话号码上使用此正则表达式:
(?:\+\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
+92 084 765 4902-> 0847654902
+922(064)864 0921-> 0648640921
842.231.9072-> 8422319072
+1(972)-864-0921-> 9728640921
+92 33-783-9382-> 337839282
答案 0 :(得分:1)
从您显示的示例中,我假设以下规则:
+
(
和)
(请记住,这种电话号码符号规则仅在特定区域内使用。当您要对应用程序进行国际化时,您可能需要更多规则。现在可能为其他区域编写了该模式。)
每个部分的部分模式如下:
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
上面的代码对于其他可能的输入可能无法正常工作,请尝试自行修复它以适合此类输入。