我有此代码:
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产生的整数范围并不总是与characters数组同步。 我知道UTF8在字节和字符之间没有一对一的对应关系,但是如何同步字符串和[Characters]?我需要:
-将匹配序列内的字符序列检索为[Character]
-在缓冲区(字符串)的每个匹配序列周围插入一个标记(例如
我该怎么做?
答案 0 :(得分:0)
问题是NSRange基于UTF16,因此生成的NSRange的位置不一定与字符数组中的字符位置相同(并非每个字符都可以用一个字节表示)。您需要将生成的NSRange转换为Range并使用String 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)
}
}
}