斯威夫特弦乐和[字符]

时间:2020-09-27 17:36:36

标签: swift string indexing 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产生的整数范围并不总是与characters数组同步。 我知道UTF8在字节和字符之间没有一对一的对应关系,但是如何同步字符串和[Characters]?我需要:

-将匹配序列内的字符序列检索为[Character]

-在缓冲区(字符串)的每个匹配序列周围插入一个标记(例如 ...

我该怎么做?

1 个答案:

答案 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)
        }
    }
}