我有一个NSArray
of NSStrings
,我想做的是例如寻找 8 个字符的字符串,其中 R 作为第一个字符,A 作为第三个字符。
在 SQL 中,我会这样做:
SELECT string FROM array WHERE string LIKE 'R*A*****';
但我不知道在 Obj-C 中这样做的最佳方法是什么。当然,我可以创建一个检查字符的函数,characterAtIndex:
但我确信有一些更快的方法可以像正则表达式一样进行。
谢谢你的帮助。
我有一个NSArray
of NSStrings
,我想做的是例如寻找 8 个字符的字符串,其中 R 作为第一个字符,A 作为第三个字符。
在 SQL 中,我会这样做:
SELECT string FROM array WHERE string LIKE 'R*A*****';
但我不知道在 Obj-C 中这样做的最佳方法是什么。当然,我可以创建一个检查字符的函数,characterAtIndex:
但我确信有一些更快的方法可以像正则表达式一样进行。
谢谢你的帮助。
最简单的方法可能只是使用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;
}
];
只是为了完整起见:类似于 SQL 查询的模式匹配方法是
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"SELF LIKE %@", @"R?A?????"];
NSArray *filtered = [array filteredArrayUsingPredicate:predicate];
但是一项快速测试表明,Carl 的答案中的基于块的过滤要快得多,至少在这种情况下是这样。
使用 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]]);
}
希望能帮助到你!!!