正则表达式应用程序到字符串?



目前,我正在循环使用电话号码以在数据库中查找匹配项。但是,我需要删除破折号和任何区号,以便数据库搜索可以精确。目前,我正在尝试在电话号码上使用此正则表达式:

(?:+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 literalMissing 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

对于可能的其他输入,上面的代码可能无法按预期工作,请尝试自行修复它以适应此类输入。

相关内容

最新更新