【发布时间】:2026-02-24 03:35:01
【问题描述】:
我有以下功能可以在UILabel 中查找和突出主题标签或提及(@ 或 #):
class func addLinkAttribute(pattern: String,
toText text: String,
withAttributeName attributeName : String,
toAttributedString attributedString :NSMutableAttributedString,
withLinkAttributes linkAttributes: [NSObject : AnyObject]) {
var error: NSError?
if let regex = NSRegularExpression(pattern: pattern, options:.CaseInsensitive, error: &error) {
regex.enumerateMatchesInString(text, options: .allZeros, range: NSMakeRange(0, count(text))) { result, flags, stop in
let range = result.range
let start = advance(text.startIndex, range.location)
let end = advance(start, range.length)
let foundText = text.substringWithRange(Range<String.Index>(start: start,end: end))
var linkAttributesWithName = linkAttributes
linkAttributesWithName[attributeName] = foundText
attributedString.addAttributes(linkAttributesWithName, range: range)
}
}
}
如果我传递一个主题标签 (#)(\\w+) 或提及 (@)(\\w+) 模式,则代码可以完美运行,但如果文本包含表情符号,则范围会被其前面的表情符号数量所抵消:
我知道 Swift 处理字符串的方式与 Objective-C 不同,因为 count(string) 和 count(string.utf16) 给我的结果不同,但我不知道在使用正则表达式时如何解释这一点。
我可以检查两个计数之间的差异并偏移范围,但这对我来说似乎是错误的和 hacky。一定有别的办法。
【问题讨论】: