swift - Swift 字符串和 [Character]
问题描述
我有这个代码:
let txt = "over 100MB+ of text..."
let tokenizedText = Array (txt)
let regex = try NSRegularExpression (pattern: "(?s)<tu>.*?</tu>")
let r = regex.matches (in: txt, range: NSRange (txt.startIndex..<txt.endIndex, in: txt))
for match in r {
let befOfMatch = match.range.lowerBound
let endOfMatch = match.range.lowerBound + match.range.length
// check the result
if tokenizedText[begOfMatch] != "<" {
print ("error") // from time to time!!!!
}
}
=> regex.matches 生成的整数范围并不总是与字符数组同步。我知道 UTF8 在字节和字符之间没有一一对应的关系,但是如何同步 Strings 和 [Characters] ?我需要:
-- 将匹配序列中的字符序列检索为 [Character]
-- 在缓冲区(字符串)中的每个匹配序列周围插入一个标签(例如 <found> ... </found>)
我怎样才能做到这一点?
解决方案
问题在于 NSRange 它基于 UTF16,因此生成的 NSRange 的位置不一定与字符数组中的字符位置相同(并非每个字符都可以用单个字节表示)。您需要将生成的 NSRange 转换为 Range 并使用字符串范围的下限检查原始字符串:
let txt = "over 100MB+ of text... <tu>whatever</tu>"
let tokenizedText = Array (txt)
let regex = try NSRegularExpression (pattern: "(?s)<tu>.*?</tu>")
let r = regex.matches (in: txt, range: NSRange (txt.startIndex..<txt.endIndex, in: txt))
for match in r {
if let range = Range(match.range, in: txt) {
print (txt[range])
if txt[range.lowerBound] == "<" {
print(true)
} else {
print(false)
}
}
}
推荐阅读
- nginx - Nginx 显示子链接和路径的 404 错误
- node.js - TypeError:无法读取 null 的属性“avatarURL”| 尝试导出帮助命令
- java - 从 groovy 脚本调用方法时,我在 Jenkisn 上收到 java.lang.NullPointerException
- python - 卷积神经网络中的测试
- r - 根据复选框选择从 Rshiny 中的 data.frame 中选择多列并显示热图
- c# - 使用 Application.DoEvents() 时如何抑制 Ding 声音
- python - Python:根据来自另一个文件的字段匹配过滤行
- c# - C#如何有效地认证UDP数据包
- html - 当用户单击它时,将“添加”图标更改为“添加圆圈”图标
- angular - Angular8:为每条路线加载不同的谷歌字体