0

我有一个NSArrayof NSStrings,我想做的是例如寻找 8 个字符的字符串,其中 R 作为第一个字符,A 作为第三个字符。

在 SQL 中,我会这样做:

SELECT string FROM array WHERE string LIKE 'R*A*****';

但我不知道在 Obj-C 中这样做的最佳方法是什么。当然,我可以创建一个检查字符的函数,characterAtIndex:但我确信有一些更快的方法可以像正则表达式一样进行。

谢谢你的帮助。

4

3 回答 3

3

最简单的方法可能只是使用indexesOfObjectsPassingTest:, 并定义一个块来检查您关心的两个字符。就像是:

NSIndexSet *indexes = [array indexesOfObjectsPassingTest:
    ^(id obj, NSUInteger idx, BOOL *stop)
    {
        if (([obj length] == 8) &&
            ([obj characterAtIndex:0] == 'R') &&
            ([obj characterAtIndex:2] == 'A'))
            return YES;
        else
            return NO;
    }
];
于 2013-10-18T04:36:37.973 回答
2

只是为了完整起见:类似于 SQL 查询的模式匹配方法是

NSPredicate *predicate =
            [NSPredicate predicateWithFormat:@"SELF LIKE %@", @"R?A?????"];
NSArray *filtered = [array filteredArrayUsingPredicate:predicate];

但是一项快速测试表明,Carl 的答案中的基于块的过滤要快得多,至少在这种情况下是这样。

于 2013-10-18T05:18:55.083 回答
1

使用 characterAtIndex 是最简单的选择,但如果你真的想使用正则表达式模式匹配,那么这个模式可能会有所帮助。

 for(int i=0;i<[array count];i++)       //'array' is the nsarray with collection of strings
{
    string = [array objectAtIndex:i];    //'string' takes each string from the array
    NSRegularExpression* reg=[NSRegularExpression regularExpressionWithPattern:@"R[a-zA-Z]{1}A[a-zA-Z]{5}" options:0 error:&error];

    NSTextCheckingResult *match=[reg firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];

    NSLog(@"result is %@",[string substringWithRange:[match rangeAtIndex:0]]);             


}

希望能帮助到你!!!

于 2013-10-18T05:35:29.833 回答