如何使用NSPredicate将以数字或符号开头的字符串过滤到NSArray。
示例:
array = {“John”,“Mary”,“Aroldo”,“1John”,“+ Mary”}
到newArray = {“1John,”“+ Mary”}
答案 0 :(得分:6)
以下是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);
}
答案 1 :(得分:0)
它不使用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];
您可能想要仔细检查块中的返回条件,因为我没有测试它。
答案 2 :(得分:0)
您可以使用带有正则表达式的谓词来完成您的目标。
通常,您要查找的正则表达式模式是"[chars].*"
,它将匹配示例中以c,h,a,r或s开头的任何字符串。您可以替换想要匹配的实际字符。
为了使构造更清晰,你可以创建一个你想要匹配的实际字符串,一个带有正则表达式模式的字符串,最后是谓词。
如果你对正则表达式和谓词非常熟悉,你当然可以将它全部收紧到一行代码。
NSString *matchChars = @"0123456789+-,."; // Add other characters you want to match
NSString *regexString = [NSString stringWithFormat:@"[%@].*", matchChars];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self matches[cd] %@", regexString];