目标C正则表达式不一致

时间:2014-06-29 06:31:51

标签: objective-c regex cocoa

所以我在这里有一个正则表达式:http://regex101.com/r/lU3sQ5

基本上,由此:"/sample/path/directory" "/sample/path/directory/tmp\" tmp" 172.28.128.5 -alldirs -mapall=501:20

我想要匹配:

/sample/path/directory

/sample/path/directory/tmp\" tmp

问题是,当我在目标c中使用完全相同的正则表达式时,它似乎不起作用..这是我的代码:

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\"(.*?[^\\\"])\"" options:0 error:nil];
    NSArray *pathArr = [regex matchesInString:line options:0 range:NSMakeRange(0, [line length])];
    for (NSTextCheckingResult *pathResult in pathArr) {
        if (pathResult.range.length > 1) {
            NSString *path = [line substringWithRange:[pathResult rangeAtIndex:1]];
            NSLog(@"%@", path);
        }
    }

这是我得到的输出:

/sample/path/directory
/sample/path/directory/tmp\

任何建议都会有所帮助,谢谢

1 个答案:

答案 0 :(得分:1)

这是一个更安全的正则表达式,用于匹配可以包含转义引号的引号内部:

(?<!\\)"(?:\\"|[^"\r\n])*"

demo。马上就会添加解释。 :)

在Objective C中,要迭代匹配,你可以这样做:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<!\\\\)\"(?:\\\\\"|[^\"\r\n])*\"" options:0 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. 
     }

解释

  • 负面的后视(?<!\\)可确保前面的内容不是反斜杠
  • "匹配开头报价
  • (?:\\"|[^"\r\n])匹配反斜杠+引号,|或一个既不是引号又不是换行符的字符
  • *量词重复零次或多次
  • "与结束报价相匹配