gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 14:09:41 26 4
gpt4 key购买 nike

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

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

最佳答案

根据您展示的示例,我假设以下规则:

电话号码分为 3 或 4 部分

第 1 部分(可选)

  • +
  • 1 到 3 位数字
  • 后面有一个或多个空格

第二部分

  • 可以包含在()
  • 2 或 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

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

关于swift - 正则表达式应用到字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52694278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com