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

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤以数字或符号开头的字符串到 NSArray【英文标题】:Filter strings that start as numbers or symbols to an NSArray with NSPredicate 【发布时间】:2013-02-27 17:05:55 【问题描述】:

如何。

示例:

array = "John", "Mary", "Aroldo", "1John", "+Mary"

to newArray = "1John," "+Mary"

【问题讨论】:

Mary + 如何进入 newArray?既不以数字开头,也不以符号开头? 对不起,我写错了,但修复 【参考方案1】:

这里有 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 %@", @"[^\\pL].*"];
    filtered = [unfiltered filteredArrayUsingPredicate:predicate];
    STAssertTrue([filtered isEqualToArray:expected], nil);


- (void)testFilteredArray2

    predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^\\pLetter].*"];
    filtered = [unfiltered filteredArrayUsingPredicate:predicate];
    STAssertTrue([filtered isEqualToArray:expected], nil);


- (void)testFilteredArray3

    predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[^\\pGeneral_Category=Letter].*"];
    filtered = [unfiltered filteredArrayUsingPredicate:predicate];
    STAssertTrue([filtered isEqualToArray:expected], nil);

【讨论】:

【参考方案2】:

它不使用 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];

您可能需要仔细检查块中的返回条件,因为我没有测试它。

【讨论】:

【参考方案3】:

您可以使用带有正则表达式的谓词来完成您所追求的目标。

一般来说,您正在寻找的正则表达式模式是"[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];

【讨论】:

以上是关于使用 NSPredicate 过滤以数字或符号开头的字符串到 NSArray的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 过滤 EKEvent

NSPredicate 按数组中包含的第一个字母过滤

使用短语和数字序列设置 NSPredicate

NSPredicate 用于过滤对象的强项是 BEGINS WITH special characters

通配符与正规

以数字或符号模式打开或启动软件键盘