大括号内的文本正则表达式

时间:2014-07-21 08:30:10

标签: objective-c regex nsregularexpression

我是regexes的总菜鸟。我试图提出一个可以在大括号中捕获文本的正则表达式。例如:

{t} this text shouldn't {1}{2} be captured {3} -> t, 1, 2, 3

这是我尝试过的:

NSString *text = @"{t} this text shouldn't {1}{2} be captured {3}";
NSString *pattern = @"\\{.*\\}";    // The part I need help with
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:kNilOptions
                                                                         error:nil];
NSArray *matches = [regex matchesInString:text
                                  options:kNilOptions
                                    range:NSMakeRange(0, text.length)];
for (NSTextCheckingResult *result in matches)
{
    NSString *match = [text substringWithRange:result.range];
    NSLog(@"%@%@", match , (result == matches.lastObject) ? @"" : @", ");
}

它产生了{t} this text shouldn't {1}{2} be captured {3}

我很抱歉这么简单的请求,但我只是匆忙而且我对正则表达不太了解。

1 个答案:

答案 0 :(得分:2)

Lookahead和Lookbehind

NSRegularExpressions支持外观,因此我们可以使用这个简单的正则表达式:

(?<=\{)[^}]+(?=\})

查看the regex demo中的匹配项。

要迭代所有匹配项,请使用:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\\{)[^}]+(?=\\})" options:NSRegularExpressionAnchorsMatchLines error:&error];
NSArray *matches = [regex matchesInString:subject options:0 range:NSMakeRange(0, [subject length])];
NSUInteger matchCount = [matches count];
if (matchCount) {
    for (NSUInteger matchIdx = 0; matchIdx < matchCount; matchIdx++) {
        NSTextCheckingResult *match = [matches objectAtIndex:matchIdx];
        NSRange matchRange = [match range];
        NSString *result = [subject substringWithRange:matchRange];
    }
}
else {  // Nah... No matches.
     }

<强>解释

  • lookbehind (?<=\{)声称在当前位置之前的是一个左大括号
  • [^}]+匹配所有不是右括号的字符
  • 前瞻(?=\})断言接下来的是一个右大括号

<强>参考