我對 NSRange、RangeExpression 和 NSAttributedString 函式失去了理智。我想要實作的是獲取文本中出現的子字串的所有范圍。我最終得到的是這樣的:
let ranges: [NSRange] = textsToChange.compactMap { textToChange in
if textToChange.result != nil {
let strNumber: NSString = textFieldText as NSString
return (strNumber).range(of: textToChange.text)
} else {
return nil
}
}
我正在嘗試通過在 Textfield 的文本中查找每個文本來將包含 TextToChange 物件的 textsToChange 陣列(TextToChange 只是一個包含三個欄位的物件:文本、值和結果,都是一個字串。然而,文本是這里唯一重要的)到 NSRanges。當 textsToChange 的每個包含的文本都是唯一的時,一切都會按預期進行。但是,如果 textsToChange 包含任何重復項,讓我們說:
“汽車”、“汽車”、“自行車”
然后,當有一個 textField 文本時:
“我擁有一輛黃色汽車、一輛藍色汽車和一輛綠色自行車”
我得到范圍 {15, 3}, {15, 3} 和 {43, 7} 因為 rangeOf 回傳單詞第一次出現的范圍。你知道有什么簡單的函式可以得到給定子串的不同范圍(所以:{15, 3}, {27, 3} 和 {43, 7})?
uj5u.com熱心網友回復:
您可以嘗試使用正則運算式...
func rangesForWords(_ words: [String], in text: String) -> [NSRange]? {
var ranges: [NSRange] = []
let ptrn = words.joined(separator: "|")
do {
let regex = try NSRegularExpression(pattern: ptrn, options: [.caseInsensitive])
let items = regex.matches(in: text, options: [], range: NSRange(location: 0, length: (text as NSString).length))
ranges = items.map{$0.range}
} catch {
// regex was bad?
return nil
}
return ranges
}
它可以這樣呼叫:
let text: String = "I own a yellow car, a blue car and a green bicycle"
let words: [String] = [
"car",
"bicycle",
]
if let ranges = rangesForWords(words, in: text) {
print(ranges)
} else {
print("rangesForWords returned nil")
}
這給了我這個輸出:
[{15, 3}, {27, 3}, {43, 7}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356466.html
上一篇:自定義單元格中自定義UITableViewCell內的多個UIStackViews沒有Storyboard不起作用
