在目标C中匹配具有正则表达式的方形括号

时间:2012-10-26 12:10:42

标签: objective-c regex nspredicate

我找不到任何专门解决如何在Stack Overflow或Google上的谓词中找到方括号的内容,所以我想我会在这里发布,看看是否有人可以解释这个解决方案。

NSString *mstr = @"fasd[981db7007771ffa3]dfaads";
NSString *test =@".*\\[[0-9,a-f]{16}\\].*";
//NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*\\\\[[0-9,a-f]{16}\\\\].*'"]; //works
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", test];
if ([pred evaluateWithObject:mstr]) {
    NSLog(@"Yes");
}

似乎在线性转移括号时你需要四个反斜杠但是如果你把它放在一个字符串中你只需要两个。不清楚为什么会这样。

1 个答案:

答案 0 :(得分:2)

原因是因为NSPredicate与C编译器一起使用它自己的反斜杠转义。那么,让我们先介绍一下先完成的步骤:

<强>来源:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"\\\\[(regex here)\\\\]"];

C-precompiler :(取消一组反斜杠)

NSPredicate *pred = [NSPredicate predicateWithFormat:@"\\[(regex here)\\]"];

NSPredicate内部编译器 :(取消第二组反斜杠,编译正则表达式)。

NSPredicate *pred = [NSPredicate predicateWithFormat:@"\[(regex here)\]"];

当传入字符串文字时,它首先由NSPredicate编译,而在传递变量时,它不会以相同的方式编译(它会跳过转义部分)。