NSPredicateを使用してNSArrayに数値または記号として始まる文字列をフィルタリングする方法。
例:
array = {"John"、 "Mary"、 "Aroldo"、 "1John"、 "+ Mary"}
to newArray = {"1John、" "+ Mary"}
NSPredicateを使用してNSArrayに数値または記号として始まる文字列をフィルタリングする方法。
例:
array = {"John"、 "Mary"、 "Aroldo"、 "1John"、 "+ Mary"}
to newArray = {"1John、" "+ Mary"}
その方法は4つあります。すべての例で、否定文字クラスを使用しています。リクエストは数字と記号を除外することでしたが、アルファベット以外の文字で始まる単語を除外することもできます。
- (void)testFilterArray0
{
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^a-zA-Z].*"];
filtered = [unfiltered filteredArrayUsingPredicate:predicate];
STAssertTrue([filtered isEqualToArray:expected], nil);
}
- (void)testFilteredArray1
{
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^\\p{L}].*"];
filtered = [unfiltered filteredArrayUsingPredicate:predicate];
STAssertTrue([filtered isEqualToArray:expected], nil);
}
- (void)testFilteredArray2
{
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^\\p{Letter}].*"];
filtered = [unfiltered filteredArrayUsingPredicate:predicate];
STAssertTrue([filtered isEqualToArray:expected], nil);
}
- (void)testFilteredArray3
{
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^\\p{General_Category=Letter}].*"];
filtered = [unfiltered filteredArrayUsingPredicate:predicate];
STAssertTrue([filtered isEqualToArray:expected], nil);
}
正規表現で述語を使用して、目的を達成できます。
一般に、探している正規表現パターンは"[chars].*"
、c、h、a、r、または s で始まる任意の文字列に一致するものです (この例では)。一致させたい実際の文字に置き換えます。
構成をより明確にするために、一致させたい実際の文字の文字列、正規表現パターンを含む文字列、そして最後に述語を作成できます。
正規表現と述語に慣れている場合は、もちろん、コードを 1 行にまとめることもできます。
NSString *matchChars = @"0123456789+-,."; // Add other characters you want to match
NSString *regexString = [NSString stringWithFormat:@"[%@].*", matchChars];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self matches[cd] %@", regexString];
NSPredicate は使用しませんが、機能します
NSIndexSet *indexSet = [array indexesOfObjectsPassingTest:^BOOL(NSString *name, NSUInteger idx, BOOL *stop) {
unichar ch = [name characterAtIndex:0];
BOOL isLetter = (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122);
return !isLetter;
}];
NSArray *newArray = [array objectsAtIndexes:indexSet];
私はテストしていないので、ブロックの戻り条件を再確認することをお勧めします。