You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS UITableViewCell动态高亮指定字符串区间的技术实现问题

解决Swift中动态高亮字符串中间内容的问题

原代码问题分析

  • 原highlightWordsIn方法仅能匹配固定字符串,无法处理「Work for」和「is Started/Ended」之间的动态内容
  • 未考虑「is Started」和「is Ended」两种不同结尾的情况

解决方案

通过正则表达式精准捕获需要高亮的中间内容,再为其添加指定属性:

1. 修改String扩展,实现动态高亮逻辑

extension String {
    func highlightMiddleContent() -> NSMutableAttributedString {
        let result = NSMutableAttributedString(string: self)
        // 正则匹配Work for与is Started/Ended之间的内容
        let pattern = "Work for (.*?) is (Started|Ended)"
        guard let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) else {
            return result
        }
        let matches = regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.utf16.count))
        
        for match in matches {
            // 提取分组1的范围(即需要高亮的中间内容)
            let targetRange = match.range(at: 1)
            // 添加红色+加粗属性
            result.addAttributes([
                .foregroundColor: UIColor.red,
                .font: UIFont.boldSystemFont(ofSize: 17)
            ], range: targetRange)
        }
        return result
    }
}

2. 更新StudentCell中的调用逻辑

class StudentCell: UITableViewCell {
    var welcomeData: StudentListModel.Data? {
        didSet {
            setCellData()
        }
    }

    func setCellData() {
        if let titleValue = welcomeData?.title {
            nameValue.attributedText = titleValue.highlightMiddleContent()
        }
    }
}

代码说明

  • 正则表达式Work for (.*?) is (Started|Ended):(.*?)采用非贪婪匹配,确保只捕获「Work for」到最近的「is Started/Ended」之间的内容
  • 通过NSRegularExpression获取匹配结果,直接提取目标内容的范围进行属性设置
  • 一次性合并属性设置,避免冗余遍历操作

内容的提问来源于stack exchange,提问作者kiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:51:03