1

我找不到任何专门解决如何在 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");
}

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

4

1 回答 1

2

原因是因为NSPredicate它自己的反斜杠转义以及 C 编译器的转义。所以,让我们来看看首先完成的步骤:

来源

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

C-预编译器:(取消一组反斜杠)

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

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

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

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

于 2012-10-26T12:43:33.407 回答