【问题标题】:Coloring Text within $ - NSString$中的着色文本 - NSString
【发布时间】:2016-06-19 03:29:43
【问题描述】:
pattern = @"(\\$.*?\\$)";
regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
matches = [regex matchesInString:self options:0 range: searchedRange];
for (NSTextCheckingResult* match in matches) {
    [string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:[match range]];
}

我正在使用上面的代码为两个美元符号之间的文本着色。因此,以下字符串中的 hello world 文本将变为蓝色,并移除美元符号:

@"This won't be blue. $hello world$. This won't be blue";

但是,现在我希望单个美元符号不被涂成蓝色。我只希望模式在第一个美元符号后面是 a-zA-Z0-9 中的一个字符时匹配,同样第二个美元符号前面应该是 a-zA-Z0-9 中的一个字符。我该怎么做?

【问题讨论】:

  • 美元之间的内容可以是单个字符吗?

标签: ios objective-c regex


【解决方案1】:

将捕获组移动到第一个$ 之后和最后一个$ 之前,并使用matchAtIndex:1 仅获取组1 值:

pattern = @"\\$([A-Za-z0-9].*?)(?<=[A-Za-z0-9])\\$";
               ^ ^^^^^^^^^^   ^^^^^^^^^^^^^^^^

[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:[match matchAtIndex:1]];

图案细节:

  • \\$ - 文字 $
  • ([A-Za-z0-9].*?) - 一个字母或数字后跟 0+ 任何字符,但换行符尽可能少到第一个
  • (?&lt;=[A-Za-z0-9])\\$ - $ 前面有一个字母或数字

如果您只需要确保在第一个 $ 之后出现一个数字或字母,请使用

pattern = @"\\$\\b(?!_)(.*?)\\$";

第一个$ 后面可以跟字母或数字,但不能跟_

【讨论】:

    【解决方案2】:

    你可能只需要稍微调整一下你的正则表达式。

    http://regexr.com/ 是一个非常好的资源,因为它可以让您实时尝试新的表达方式。

    在这种特定情况下,您可能需要:

    pattern = @"(\\$.+\\$)";
    

    * 和 + 的区别在于 + 至少需要 1 个字符。还有 ?没有做任何事情,因为 * 默认情况下是可选的。

    【讨论】:

    • 但这仍然允许空格字符
    • 啊,我错过了那一点,你只需要更换 .用 [] 包围的问题中指定的内容
    • 哦,好吧,完美。谢谢:)
    • 这将包括 $ 替换
    • @rock321987 当然可以,但是如果您想为某些文本添加属性标签,您可能只需要使用 HTML
    【解决方案3】:

    我相信这是我想要的pattern = @"(\\$[a-zA-Z0-9]{1}.*\\$)";

    感谢 Tristan 提供资源

    【讨论】:

    • 你可以试试(?&lt;=\\$)(?=[A-Za-z0-9])[^$]*(?=\\$)
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2012-02-28
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多