实现步骤
- 导入 Foundation 框架:在 Swift 中使用正则表达式,需要导入
Foundation
框架。
import Foundation
- 定义正则表达式模式:
- 对于日期,由于存在三种格式,分别定义三种格式的正则表达式模式,然后使用
|
连接表示或关系。
- 对于人名,中文范围在
\u4e00
到 \u9fff
之间,长度限定在 2 到 4 个字符。
let datePattern = "(\\d{4})[-/年](\\d{1,2})[-/月](\\d{1,2})日?"
let namePattern = "[\\u4e00-\\u9fff]{2,4}"
- 创建正则表达式对象:
guard let dateRegex = try? NSRegularExpression(pattern: datePattern, options: []) else { return }
guard let nameRegex = try? NSRegularExpression(pattern: namePattern, options: []) else { return }
- 执行匹配并提取结果:
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)
}
可能遇到的问题及解决方案
- 正则表达式模式准确性:
- 问题:日期格式可能存在变体,如年份可能是 2 位数字(但题目明确为 4 位数字),或者日期分隔符可能有其他特殊符号等。人名可能存在复姓或罕见姓氏等导致匹配不准确。
- 解决方案:进一步完善正则表达式模式,比如对于日期格式,考虑更多的变体情况。对于人名,如果有更多信息(如姓氏库等),可以更准确地匹配。
- 性能问题:
- 问题:如果文本内容非常长,执行正则表达式匹配可能会消耗大量时间和内存。
- 解决方案:可以尝试对文本进行分段处理,或者优化正则表达式模式,减少不必要的回溯等操作。
- 编码问题:
- 问题:在处理包含中文的文本时,可能会遇到编码不一致的问题,导致匹配失败。
- 解决方案:确保文本的编码是统一的 UTF - 8 编码,在 Swift 中,字符串默认是 UTF - 8 编码,一般不需要额外处理,但如果从外部数据源读取,需要确认编码情况。