我是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}
。
我很抱歉这么简单的请求,但我只是匆忙而且我对正则表达不太了解。
答案 0 :(得分:2)
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.
}
<强>解释强>
(?<=\{)
声称在当前位置之前的是一个左大括号[^}]+
匹配所有不是右括号的字符(?=\})
断言接下来的是一个右大括号<强>参考强>