NSString:在另一个字符串中查找字符串的一部分

时间:2011-09-20 17:22:26

标签: objective-c ios nsstring

我知道如何在另一个字符串中找到一个字符串,这很容易。但在这种情况下,我想在allProfessors字符串中找到John Smith。所以我想我可以拆分字符串并搜索这两个部分,这可以解决我想要的问题:

NSString *fullName = @"John Smith";
NSArray *parts = [fullName componentsSeparatedByString:@" "];
NSString *allProfessors = @"Smith, John; Clinton, Bill; Johnson, John";
NSRange range = [[allProfessors lowercaseString] rangeOfString:[[parts objectAtIndex:0] lowercaseString]];
NSRange range2 = [[allProfessors lowercaseString] rangeOfString:[[parts objectAtIndex:1] lowercaseString]];
if(range.location != NSNotFound && range2.location != NSNotFound) {
    NSLog(@"Found");
} else {
    NSLog(@"Not Found");
}

我想知道的是,这是最好的方法吗?还是有更优选的方法来做我想做的事?

除此之外,如果我的fullName比我的allProfessors名称长,如下所示:

NSString *fullName = @"Gregory Smith";
NSString *allProfessors = @"Smith, Greg; Clinton, Bill; Johnson, John";

我仍然希望格雷格史密斯和格雷戈里史密斯有一场比赛。

1 个答案:

答案 0 :(得分:2)

您可以使用我更喜欢使用的正则表达式。请参阅RegexKitLite

使用RegexKitLite,您可以使用正则表达式,如(未经测试):

NSString *regEx = @"(?i)Smith,\\s*\\w";
NSArray *matchingStrings = [allProfessors componentsMatchedByRegex:regEx];

if ([matchingStrings count] == 0)  // not found!
{
   [...]
}
else
{
   [...]
}

使用RegexKitLite你也可以使用[NSString stringByMatching:(NSString *)]。

你可以用正则表达式做很多事情。通过Using RegexKitLite提供了大量不同的功能。上面的正则表达式应该找到姓氏为Smith的人。

正则表达式解释:

  • (?i)使此案例不敏感
  • Smith匹配史密斯的姓氏。显然你可以把它改成任何东西
  • ,匹配逗号
  • \\s*匹配任意数量的空格(贪婪)
  • \\w匹配单词

此外,您可以使用[NSString rangeOfString:options:]功能,如:

if ([myString rangeOfString:@"John" options:NSCaseInsensitiveSearch].location != NSNotFound &&
    [myString rangeOfString:@"Smith" options:NSCaseInsensitiveSearch].location != NSNotFound)
{
   NSLog(@"Found");
}
else
{
   NSLog(@"Not Found");
}

另请参阅类似[rangeOfString:options:range:locale:]之类的函数,以便您可以执行不区分大小写的搜索,甚至可以指定区域设置。