我有以下字符串:“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);
}
}
答案 0 :(得分:2)
看起来您错误地转义了问号:您使用了一个反斜杠,但Objective-C编译器在字符串文字中需要两个斜杠才能表示单个反斜杠:
NSString *pattern = @"<\\?(.+?)\\?>";
如果没有额外的斜杠,单斜线不会成为字符串的一部分,因此正则表达式引擎会看到此表达式<?(.+?)?>
,将开始角括号视为可选,然后继续匹配整个文本直到结束角度支架
转义元字符(如问号和点)的一种方法是将它们包含在字符类中,而不是使用反斜杠。这个表达式与你的表达式相同,但它没有额外的斜线转义:
NSString *pattern = @"<[?](.+?)[?]>";