我试图检测星号之间的任何单词:
NSString *questionString = @"hello *world*";
NSMutableAttributedString *goodText = [[NSMutableAttributedString alloc] initWithString:questionString]; //should turn the word "world" blue
NSRange range = [questionString rangeOfString:@"\\b\\*(.+?)\\*\\b" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
DLog(@"found a word within asterisks - this never happens");
[goodText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
}
但我从来没有得到积极的结果。正则表达式有什么问题?
答案 0 :(得分:3)
@"\\B\\*([^*]+)\\*\\B"
应该达到你的期望。
根据Difference between \b and \B in regex,您必须使用\B
代替\b
作为字边界。
最后,使用[^*]+
匹配每对星号,而不是最外面的星号。
例如,在字符串
中Hello * world * how * are * you
它将正确匹配world
和are
,而不是world how are
。
实现相同目标的另一种方法是使用?
,这会使+
非贪婪。
@"\\B\\*(.+?)\\*\\B"
同样值得注意的是rangeOfString:options
返回第一个匹配的范围,而如果您对所有匹配感兴趣,则必须使用该模式构建NSRegularExpression
实例并使用其matchesInString:options:range:
实例1}}方法。