使用Objective-C中的正则表达式获得错误的范围

时间:2014-06-17 11:26:56

标签: ios objective-c regex

我有以下字符串:“Title:”我在Objective-C中使用正则表达式从字符串中提取“/ books / 1 / title”部分。 (该字符串可以包含多个表达式)正则表达式如下< \?(。+?)\?>。我的问题是它匹配整个字符串(从索引0到24)而不是标记之间的内容。 代码如下:

NSString *object = @"Title: <?/books/1/title?>";

NSMutableString *newString = [[NSMutableString alloc] initWithString:object];

NSString *pattern = @"<\?(.+?)\?>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                           options:0 error:NULL];

NSArray *matches = [regex matchesInString:object options:0 range:NSMakeRange(0, [object length])];

for (NSInteger i = [matches count]-1; i>=0 ; i--) {
    NSTextCheckingResult * match = [matches objectAtIndex:i];

    if (match != nil && [match rangeAtIndex:0].location != NSNotFound && [match numberOfRanges] == 2) {

        NSRange part1Range = [match rangeAtIndex:1];
        NSLog(@"%lu %lu", (unsigned long)part1Range.location, (unsigned long)part1Range.length);
    }
}

1 个答案:

答案 0 :(得分:2)

看起来您错误地转义了问号:您使用了一个反斜杠,但Objective-C编译器在字符串文字中需要两个斜杠才能表示单个反斜杠:

NSString *pattern = @"<\\?(.+?)\\?>";

如果没有额外的斜杠,单斜线不会成为字符串的一部分,因此正则表达式引擎会看到此表达式<?(.+?)?>,将开始角括号视为可选,然后继续匹配整个文本直到结束角度支架

转义元字符(如问号和点)的一种方法是将它们包含在字符类中,而不是使用反斜杠。这个表达式与你的表达式相同,但它没有额外的斜线转义:

NSString *pattern = @"<[?](.+?)[?]>";