最近接了一个需求,UILabel只修改数字的字体和样色,就是需要把“今日奖金50万” 的数字加粗,变为“今日奖金50万”
因为不想搞成两个label进行拼接,所以写了一个小demo
主要思路:
代码:
extension String {
/// 改变字符串中数字的颜色和字体
///
/// - Parameters:
/// - color: 颜色
/// - font: 字体
/// - regx: 正则 默认数字 "\\d+"
/// - Returns: attributeString
func numberChange(color: UIColor,
font: UIFont,
regx: String = "\\d+") -> NSMutableAttributedString {
let attributeString = NSMutableAttributedString(string: self)
do {
// 数字正则表达式
let regexExpression = try NSRegularExpression(pattern: regx, options: NSRegularExpression.Options())
let result = regexExpression.matches(
in: self,
options: NSRegularExpression.MatchingOptions(),
range: NSMakeRange(0, count)
)
for item in result {
attributeString.setAttributes(
[.foregroundColor : color, .font: font],
range: item.range
)
}
} catch {
print("Failed with error: \(error)")
}
return attributeString
}
}
使用:
prizeLabel.attributedText = "今日奖金50万".numberChange(color: red, font:.systemFont(ofSize: 27))
扩展性:
不只局限于数字,只要是正则可以匹配的都可以替换成想要的字体,比如邮箱,网址。
附录: 部分常用正则表达式
匹配中文字符 [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内) [^\x00-\xff]
匹配网址:[a-zA-z]+://[^\s]*
匹配国内电话 \d{3}-\d{8}|\d{4}-\{7,8}
匹配腾讯QQ号 [1-9][0-9]{4,}
匹配18位身份证号^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
友情链接 正则表达式教程