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
相关产品推荐
相关产品推荐

