这个Objective-C正则表达式有什么问题?

时间:2013-11-08 04:06:51

标签: ios objective-c regex nsattributedstring nsmutableattributedstring

我试图检测星号之间的任何单词:

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];
    }

但我从来没有得到积极的结果。正则表达式有什么问题?

1 个答案:

答案 0 :(得分:3)

@"\\B\\*([^*]+)\\*\\B"

应该达到你的期望。

根据Difference between \b and \B in regex,您必须使用\B代替\b作为字边界。

最后,使用[^*]+匹配每对星号,而不是最外面的星号。

例如,在字符串

  

Hello * world * how * are * you

它将正确匹配worldare,而不是world how are

实现相同目标的另一种方法是使用?,这会使+非贪婪。

@"\\B\\*(.+?)\\*\\B"

同样值得注意的是rangeOfString:options返回第一个匹配的范围,而如果您对所有匹配感兴趣,则必须使用该模式构建NSRegularExpression实例并使用其matchesInString:options:range:实例1}}方法。