0

我正在尝试检测星号之间的任何单词:

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

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

4

1 回答 1

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

应该达到你的期望。

根据 regex 中 \b 和 \B 之间的差异,您必须使用\B代替\b单词边界。

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

例如,在字符串

你好*世界*你好吗*

它将正确匹配worldandare而不是world how are.

实现相同目的的另一种方法是使用?which 将使+非贪婪。

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

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

于 2013-11-08T05:00:39.780 回答