在$ - NSString中

时间:2016-06-19 03:29:44

标签: ios objective-c regex

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中的一个字符。我怎么能这样做?

3 个答案:

答案 0 :(得分: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 +任何字符,但换行符尽可能少到第一个
  • (?<=[A-Za-z0-9])\\$ - $前面有一个字母或数字

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

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

第一个$可以跟随字母或数字,但不是_

答案 1 :(得分:0)

您可能只需稍微调整正则表达式。

一个非常好的资源是http://regexr.com/因为它可以让你现场试用新的表达。

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

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

*和+之间的区别是+需要至少1个字符。也是?没有做任何事情,因为默认情况下*会使某些东西成为可选项。

答案 2 :(得分:0)

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

感谢Tristan的资源