使用 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的主要内容,如果未能解决你的问题,请参考以下文章