所以我在这里有一个正则表达式: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\
任何建议都会有所帮助,谢谢
答案 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])
匹配反斜杠+引号,|
或一个既不是引号又不是换行符的字符*
量词重复零次或多次"
与结束报价相匹配