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

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

示例:

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

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

【问题讨论】:

  • Mary + 如何进入 newArray?既不以数字开头,也不以符号开头?
  • 对不起,我写错了,但修复

标签: iphone ios regex nspredicate


【解决方案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 %@", @"[^\\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);
}

【讨论】:

    【解决方案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];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-08
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多