使用NSPredicate过滤以数字或符号开头的字符串到NSArray

时间:2013-02-27 17:05:56

标签: iphone ios regex nspredicate

如何使用NSPredicate将以数字或符号开头的字符串过滤到NSArray。

示例:

  

array = {“John”,“Mary”,“Aroldo”,“1John”,“+ Mary”}

     

到newArray = {“1John,”“+ Mary”}

3 个答案:

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