1

[number]_[number].png という形式のファイル パスの配列をフィルター処理して、特定の番号 (1 など) で始まるパスのみを取得しようとしています。

これは私が試したものです:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"self MATCHES '%@/1_[0-9]+.png'",
                            [[[NSBundle mainBundle] resourcePath]
                                stringByAppendingPathComponent:@"Images"]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                     filteredArrayUsingPredicate:predicate];

空の配列を取得します。MATCHES の代わりに LIKE を使用してみました。[cd] フラグを使用してみましたが、問題ありません。それでも、私は常に空の配列を取得します。それは正規表現で何かですか?


編集:

predicateWithFormat に問題があったようです。

フォーマット文字列に続いて引数を取得して、フォーマット文字列に置き換えると思いました。そのようには機能しません。引数は無視され、フォーマット文字列では何も置換されません。

したがって、解決策は次のとおりです。

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          [NSString stringWithFormat:
                           @"self MATCHES '%@/1_[0-9]+.png'",
                           [[[NSBundle mainBundle] resourcePath]
                              stringByAppendingPathComponent:@"Images"]]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                    filteredArrayUsingPredicate:predicate];
4

1 に答える 1

0

問題は、コードの 1 行目と 2 行目の競合にあるようです。最初の行はあなたを設定するNSPredicateので、次のようにフォーマットされます:

Images/1_#.png

Images2 行目では、ディレクトリ内で述語を探すように iOS に指示します。これにより、最終的な述語/パスは次のようになります。

Images/Images/1_#.png

ディレクトリを述語の先頭にNSPredicate追加する部分を削除します。Images/

ただし、上記の問題は問題ではない場合があります。コードで考えられるもう 1 つの問題は、述語の形式が正しくないことです。元のコードでは、NSPredicate での+後にを追加するのを忘れています ( の後に追加しましたが、 の後には追加しませんでした)。1[0-9]1

コードは次のようになります。

NSString *filter = @"1+_[0-9]+.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self MATCHES %@", filter];
NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"Images"] filteredArrayUsingPredicate:predicate];

私のアプリケーションで上記のコードをテストすると、NSPredicate は NSString を正常にフィルタリングします。

次のリンクもご覧ください。http://useyourloaf.com/blog/2010/07/27/filtering-arrays-with-nspredicate.html

于 2013-03-02T12:44:38.857 に答える