• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 正则表达式仅选择特殊字符包围的单词

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:38:28 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想写一个函数,它接受一个字符串并改变特殊字符中所有单词的颜色。例如:

This is a [Sample] String containing [sample words]

我想更改上面字符串中[Sample][sample words]的字体,因为它们都被特殊字符[]

我尝试过使用:

NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:_txtPostDiscussion.text];

NSArray *words=[_txtPostDiscussion.text componentsSeparatedByString" "];
for (NSString *word in words) {
    if ([word hasPrefix"["] && [word hasSuffix"]"] ) {
        NSRange range=[_txtPostDiscussion.text rangeOfString:[NSString stringWithFormat"%@ %@",pre,suf]];
        [string addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:107.0/255.0 green:148.0/255.0 blue:187.0/255.0 alpha:1.0] range:range];

        [_txtPostDiscussion setAttributedText:string];
    }
}

我也尝试使用正则表达式来获取特定特殊字符内的所有单词,但我无法制作这样的正则表达式。



Best Answer-推荐答案


如果你想匹配[Sample may some _special_ *things* here],我们首先需要找到起始[。这个括号对正则表达式有特殊的含义,所以在正则表达式中它必须用反斜杠“修饰”(转义),如下所示:\[。此外,反斜杠 \ 本身在 Objective-C 字符串中具有特殊含义,因此也必须使用第二个反斜杠对其进行转义,并编写如下:@"\\["。或者,您可以使用 escapedPatternForString 方法为您进行转义。

NSString *openTagPattern = [NSRegularExpression escapedPatternForString"["];
NSString *closeTagPattern = [NSRegularExpression escapedPatternForString"]"];

然后我们要找到几个不同的字符直到结束括号。语句“除 x 之外的任何字符”由 [^x] 编码,因此除了结束括号之外的任何字符都由 [^\]] 编码。该括号字符再次转义以按字面意思处理,并且在 Objective-C 字符串中您将编写 @"[^\\]]"。因为我们要查找 1 个或多个这样的字符,所以我们添加 +:

NSString *tagTextPattern = [NSString stringWithFormat"[^%@]+", closeTagPattern];

最后我们需要一个右括号。最终的正则表达式只是按顺序组合了这 3 种模式:

NSString *pattern = [NSString stringWithFormat"%@%@%@",
    openTagPattern,
    tagTextPattern,
    closeTagPattern];

然后您可以创建一个 NSRegularExpression 实例并调用 enumerateMatchesInString 或 matchesInString 来为您提供所有匹配项。每个匹配项都是一个 NSTextCheckingResult 对象,它有一个 range 属性来为原始属性字符串添加一个属性。

如果您知道标签文本仅限于字母、数字和下划线,则 tagTextPattern 可以简化为 \w+,即“一个或多个单词字符”,或者如果我们想要允许空格、制表符 (\s),则模式将是 [\w\s]+,即“一个或多个单词或空格字符”(不要忘记正确转义它们)。

一个常见的错误是尝试使用表达式 \[.+\],即“开括号”、“再一个任意字符”和“右括号”。这是行不通的,因为匹配算法是贪婪的(匹配越长越好),并且对于 .+ 子部分它实际上也会吃掉右括号,以及之后的所有其他内容标签(] 之后的文本),并可能将多个标签连接成一个巨大的单个标签,或者可能无法匹配最后一个 ]。 p>

关于ios - 正则表达式仅选择特殊字符包围的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208122/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap