iOS OC使用正则表达式去除特殊符号并加粗文本,适用于接入AI大模型的流模式数据的文字处理

1、编写逻辑

使用分类(Category)的方法拓展NSString,本文使用NSString (Markdown),NSString的分类来编写一个通用方法,使用正则表达式匹配字符串实现去除特殊字符,并自定义文字属性。

在接入AI大模型后,返回的字符串会带有特殊字符用于做文字处理,下面代码简单进行了文字处理展示。

2、代码实现

1、NSString+Markdown.h

复制代码
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSString (Markdown)

- (NSAttributedString *)attributedStringFromMarkdown;

@end

NS_ASSUME_NONNULL_END

2、NSString+Markdown.m

文中做了处理 ### 与 **加粗文本** 的处理,可根据需求进行拓展

复制代码
#import "NSString+Markdown.h"

static NSRegularExpression *_headerRegex;
static NSRegularExpression *_boldRegex;
static dispatch_once_t onceToken;

@implementation NSString (Markdown)

- (NSAttributedString *)attributedStringFromMarkdown {
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self];
    // 设置默认字体,做自适应高度时,必须要设置默认字体
    UIFont *defaultFont = [UIFont systemFontOfSize:20];
    [attributedString addAttribute:NSFontAttributeName value:defaultFont range:NSMakeRange(0, attributedString.length)];
    // 一次性初始化正则表达式
    dispatch_once(&onceToken, ^{
        NSError *error;
        // 匹配 ### 标题
        _headerRegex = [NSRegularExpression regularExpressionWithPattern:@"^###\\s*(.*?)\\s*(?=\n)"
                                                                 options:NSRegularExpressionAnchorsMatchLines
                                                                   error:&error];
        if (error) {
            NSLog(@"### 正则表达式初始化失败: %@", error.localizedDescription);
        }
        
        // 匹配 **加粗文本**
        _boldRegex = [NSRegularExpression regularExpressionWithPattern:@"\\*\\*(.*?)\\*\\*"
                                                               options:0
                                                                 error:&error];
        if (error) {
            NSLog(@"** 正则表达式初始化失败: %@", error.localizedDescription);
        }
    });
    
    // 处理 "### 标题" 的加粗,并去掉 "###"
    NSArray *headerMatches = [_headerRegex matchesInString:attributedString.string
                                                   options:0
                                                     range:NSMakeRange(0, attributedString.length)];
    
    for (NSTextCheckingResult *match in [headerMatches reverseObjectEnumerator]) {
        NSRange fullMatchRange = match.range;          // 包含 ### 的完整匹配范围
        NSRange contentRange = [match rangeAtIndex:1]; // 实际要加粗的内容
        
        if (contentRange.location != NSNotFound) {
            // 1️⃣ 应用加粗样式
            [attributedString addAttributes:@{
                NSFontAttributeName: [UIFont boldSystemFontOfSize:20]
            } range:contentRange];
            
            // 2️⃣ 替换 "### 标题" 只保留标题文本
            NSString *content = [attributedString.string substringWithRange:contentRange];
            [attributedString replaceCharactersInRange:fullMatchRange withString:content];
            
            
            // 3️⃣重新获取新文本的位置
            NSRange newRange = NSMakeRange(fullMatchRange.location, content.length);
            // 重新加粗
            [attributedString addAttributes:@{
                NSFontAttributeName: [UIFont boldSystemFontOfSize:20]
            } range:newRange];
            
        }
    }

    // 处理 "**加粗文本**" 的加粗,并去掉 "**"
    NSArray *boldMatches = [_boldRegex matchesInString:attributedString.string
                                               options:0
                                                 range:NSMakeRange(0, attributedString.length)];
    
    for (NSTextCheckingResult *match in [boldMatches reverseObjectEnumerator]) {
        NSRange fullMatchRange = match.range;          // 包含 ** 的完整匹配范围
        NSRange contentRange = [match rangeAtIndex:1]; // 实际要加粗的内容
        
        if (contentRange.location != NSNotFound) {
            // 1️⃣ 应用加粗样式
            [attributedString addAttributes:@{
                NSFontAttributeName: [UIFont boldSystemFontOfSize:20]
            } range:contentRange];
            
            // 2️⃣ 替换 "**加粗文本**" 只保留加粗文本
            NSString *content = [attributedString.string substringWithRange:contentRange];
            [attributedString replaceCharactersInRange:fullMatchRange withString:content];
            
            // 3️⃣重新获取新文本的位置
            NSRange newRange = NSMakeRange(fullMatchRange.location, content.length);
            // 重新加粗
            [attributedString addAttributes:@{
                NSFontAttributeName: [UIFont boldSystemFontOfSize:20]
            } range:newRange];
        }
    }

    return attributedString;
}

@end

3、调用方法

复制代码
NSString *text = [message.text attributedStringFromMarkdown].string;
相关推荐
撩得Android一次心动10 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
dadaobusi11 小时前
学习:灵犀指令集
学习
xhyu6112 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
开心猴爷13 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
iOS开发上架哦13 小时前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
后端·ios
卿卿的产品经理日记14 小时前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理
keyipatience14 小时前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
_瑞15 小时前
APM_KSCrash 原理
ios
lazy H15 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我1234515 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法