/ / Dateipfade mit NSPredicate filtern - ios, regex, filters, nspredicate

Filtern von Dateipfaden mit NSPredicate - ios, regulärer Ausdruck, Filtern, nspredicate

Ich versuche, ein Array von Dateipfaden im Format [number] _ [number] .png zu filtern und bekommen nur diejenigen, die mit einer bestimmten Zahl beginnen, sagen wir 1.

Das habe ich ausprobiert:

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];

Ich bekomme ein leeres Array. Ich habe versucht, LIKE anstelle von MATCHES zu verwenden. Ich habe versucht, die [cd] -Flaggen zu verwenden, obwohl es keine Rolle spielen sollte. Trotzdem erhalte ich immer ein leeres Array. Ist es etwas mit dem regulären Ausdruck?


Bearbeiten:

Anscheinend lag das Problem bei predicateWithFormat.

Ich dachte, es wird eine Formatzeichenfolge gefolgt von den Argumenten, die in die Formatzeichenfolge eingesetzt werden sollen. Es funktioniert nicht so. Es ignoriert die Argumente und nichts wird in der Formatzeichenfolge ersetzt.

Also die Lösung ist wie folgt:

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];

Antworten:

0 für die Antwort № 1

Es sieht so aus, als ob das Problem ein Konflikt zwischen der ersten und der zweiten Codezeile ist. Die erste Zeile setzt Ihre NSPredicate so ist es so formatiert:

Images/1_#.png

In Ihrer zweiten Zeile weisen Sie iOS an, innerhalb der nach Ihrem Prädikat zu suchen Images Verzeichnis. Auf diese Weise sieht Ihr endgültiges Prädikat / Pfad folgendermaßen aus:

Images/Images/1_#.png

Entfernen Sie den Teil des NSPredicate das hängt das an Images/ Verzeichnis an den Anfang des Prädikats.

Das Problem, das ich oben beschreibe, ist möglicherweise nicht das Problem. Ein weiteres mögliches Problem mit dem Code ist, dass Ihr Format für das Prädikat nicht korrekt ist. Vergessen Sie in Ihrem ursprünglichen Code, das hinzuzufügen + nach dem 1 in deinem NSPredikat (du hast es nach dem getan [0-9] aber nicht das 1).

Ihr Code sollte etwa so aussehen:

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

Wenn ich den obigen Code in meiner Anwendung teste, filtert das NSPredicate erfolgreich einen NSString.

Vielleicht möchten Sie auch einen Blick auf diesen Link werfen: http://useyourloaf.com/blog/2010/07/27/filtering-arrays-with-nspredicate.html