如何将正则表达式应用于带属性的字符串

移动开发 2026-07-09

我正在开发一个语法高亮工具,但这需要正则表达式(我知道,这对高亮工具来说并非最佳选择,不过这只是一次测试)。不过,当我尝试将AttributedString与正则表达式结合使用时,似乎不起作用。

另外,关于正则表达式的String方法(我在考虑它可能是 range(of:_)matches(:_),或是完全不同的东西)在我这边根本不存在。我已经导入了Foundation,所以不知道这是客户端的问题(尽管以Xcode的情况来看,这种可能性很小),还是哪里出了问题。

解决方案

要将带属性的字符串转换为普通字符串,请取它的 characters 并强制转换为String。

现在对你的正则表达式进行匹配。

要把字符串中匹配的范围转换为带属性字符串中的一个范围,请使用Range初始化器,其中 in: 代表该带属性字符串。

简单示例:

do {
    var attributedString = AttributedString("This is a test.")
    let underlyingString = String(attributedString.characters)

    let pattern = "test"
    let regex = try Regex(pattern)

    let matches = underlyingString.matches(of: regex)
    for match in matches {
        let stringRange = match.range
        if let attributedRange = Range(stringRange, in: attributedString) {
            attributedString[attributedRange].foregroundColor = .green
        }
    }
    print(attributedString)
} catch {
    print("error:", error)
}

结果:

This is a  {
}
test {
    NSColor = UIExtendedSRGBColorSpace 0 1 0 1
}
. {
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章