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

时间:2018-10-08 01:15:07

标签: swift regex

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

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

+92 084 765 4902-> 0847654902

+922(064)864 0921-> 0648640921

842.231.9072-> 8422319072

+1(972)-864-0921-> 9728640921

+92 33-783-9382-> 337839282

1 个答案:

答案 0 :(得分:1)

从您显示的示例中,我假设以下规则:

电话号码分为3或4个部分

第1部分(可选)

  • +
  • 1至3位数字
  • 跟随一个或多个空格

第2部分

  • 可以放在()
  • 2位或3位数字
  • 连字符或小数点或两端都带有多余空格的空格

Part3

  • 3位数字
  • 连字符或小数点或两端都带有多余空格的空格

Part4

  • 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

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