首页 > 解决方案 > 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>)

我怎样才能做到这一点?

标签: swiftstringindexingcharacter

解决方案


问题在于 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)
        }
    }
}

推荐阅读