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