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 つのバックスラッシュが必要なようですが、文字列に入れる場合は 2 つだけで済みます。なぜそうなのかは明らかではありません。

4

1 に答える 1

2

その理由はNSPredicate、C コンパイラと一緒に独自のバックスラッシュ エスケープを行うためです。それでは、最初に行う手順を見ていきましょう。

出典

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

C-precompiler : (1 セットのバックスラッシュをエスケープ解除します)

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

NSPredicate 内部コンパイラ: (バックラッシュの 2 番目のセットをエスケープ解除し、正規表現をコンパイルします)。

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

文字列リテラルを渡す場合はNSPredicate最初にコンパイルされますが、変数を渡す場合は同じ方法でコンパイルされません (エスケープ部分をスキップします)。

于 2012-10-26T12:43:33.407 に答える