NSString: найти части строки в другой строке - PullRequest
1 голос
/ 20 сентября 2011

Я знаю, как найти строку в другой строке, это легко.Но в этом случае я хочу найти Джона Смита в строке allProfessors.Поэтому я решил, что могу просто разбить строку и найти обе части, что работает так, как я хочу:

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 Ответ

2 голосов
/ 20 сентября 2011

Вы можете использовать регулярные выражения, которые я предпочитаю использовать.См. RegexKitLite .

. С RegexKitLite вы можете использовать регулярное выражение подобно (не проверено):

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

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

Используя RegexKitLite, вы могли бы иметь альтернативноused [NSString stringByMatching: (NSString *)].

Вы действительно можете многое сделать с помощью регулярного выражения. Используя RegexKitLite , доступно множество различных функций.Приведенное выше регулярное выражение должно найти людей с фамилией Смит.

Объяснение регулярного выражения:

  • (?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:] , чтобы вы могли выполнять поиск без учета регистра и даже указывать локаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...