MST

星途 面试题库

面试题:Swift 正则表达式实现复杂文本提取

给定一段包含多个日期(格式如:2023 - 10 - 05 或 2023/10/05 或 2023年10月05日)和人名(中文,两个字到四个字)的文本。要求使用 Swift 正则表达式,提取出所有的日期和人名,并将它们分别存储到不同的数组中。阐述实现过程中可能遇到的问题及解决方案。
17.4万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

实现步骤

  1. 导入 Foundation 框架:在 Swift 中使用正则表达式,需要导入 Foundation 框架。
import Foundation
  1. 定义正则表达式模式
    • 对于日期,由于存在三种格式,分别定义三种格式的正则表达式模式,然后使用 | 连接表示或关系。
    • 对于人名,中文范围在 \u4e00\u9fff 之间,长度限定在 2 到 4 个字符。
let datePattern = "(\\d{4})[-/年](\\d{1,2})[-/月](\\d{1,2})日?"
let namePattern = "[\\u4e00-\\u9fff]{2,4}"
  1. 创建正则表达式对象
guard let dateRegex = try? NSRegularExpression(pattern: datePattern, options: []) else { return }
guard let nameRegex = try? NSRegularExpression(pattern: namePattern, options: []) else { return }
  1. 执行匹配并提取结果
let text = "文本内容如:2023 - 10 - 05 张三 2023/10/05 李四 2023年10月05日 王五"
var dates: [String] = []
var names: [String] = []

let dateMatches = dateRegex.matches(in: text, options: [], range: NSRange(text.startIndex..., in: text))
for match in dateMatches {
    let range = Range(match.range, in: text)!
    let date = String(text[range])
    dates.append(date)
}

let nameMatches = nameRegex.matches(in: text, options: [], range: NSRange(text.startIndex..., in: text))
for match in nameMatches {
    let range = Range(match.range, in: text)!
    let name = String(text[range])
    names.append(name)
}

可能遇到的问题及解决方案

  1. 正则表达式模式准确性
    • 问题:日期格式可能存在变体,如年份可能是 2 位数字(但题目明确为 4 位数字),或者日期分隔符可能有其他特殊符号等。人名可能存在复姓或罕见姓氏等导致匹配不准确。
    • 解决方案:进一步完善正则表达式模式,比如对于日期格式,考虑更多的变体情况。对于人名,如果有更多信息(如姓氏库等),可以更准确地匹配。
  2. 性能问题
    • 问题:如果文本内容非常长,执行正则表达式匹配可能会消耗大量时间和内存。
    • 解决方案:可以尝试对文本进行分段处理,或者优化正则表达式模式,减少不必要的回溯等操作。
  3. 编码问题
    • 问题:在处理包含中文的文本时,可能会遇到编码不一致的问题,导致匹配失败。
    • 解决方案:确保文本的编码是统一的 UTF - 8 编码,在 Swift 中,字符串默认是 UTF - 8 编码,一般不需要额外处理,但如果从外部数据源读取,需要确认编码情况。