Сравнение без учета регистра NSString - PullRequest
230 голосов
/ 06 апреля 2010

Может ли кто-нибудь указать мне какие-либо ресурсы о сравнении без учета регистра в Цели C? Кажется, у него нет метода, эквивалентного str1.equalsIgnoreCase(str2)

Ответы [ 12 ]

546 голосов
/ 06 апреля 2010
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

Документация находится по адресу Методы поиска и сравнения

49 голосов
/ 29 января 2013
 NSString *stringA;
 NSString *stringB;

 if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
     // match
 }

Примечание: stringA && требуется, потому что когда stringA равно nil:

 stringA = nil;
 [stringA caseInsensitiveCompare:stringB] // return 0

и так бывает NSOrderedSame также определяется как 0.

Следующий пример - типичная ловушка:

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }
46 голосов
/ 06 апреля 2010

Альтернатива, если вы хотите больше контроля, чем просто нечувствительность к регистру:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Числовой поиск и диакритическая нечувствительность - две удобные опции.

22 голосов
/ 20 июня 2013

Перед сравнением вы всегда можете убедиться, что они в одном и том же случае:

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}

Основным преимуществом является то, что вы избегаете потенциальной проблемы, описанной matm, относительно сравнения нулевых строк. Вы можете либо проверить, что строка не равна nil, прежде чем выполнять один из методов compare:options:, или вы можете быть ленивым (как я) и игнорировать добавочную стоимость создания новой строки для каждого сравнения (которая минимальна, если только делает одно или два сравнения).

7 голосов
/ 11 июня 2014

Новый способ сделать это. iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true
7 голосов
/ 06 апреля 2010
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
6 голосов
/ 20 октября 2015

Преобразование ответа Джейсона Коко в Свифт для глубоко ленивых :)

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
6 голосов
/ 06 апреля 2010

Попробуйте этот метод

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
5 голосов
/ 25 июля 2013

для проверки с префиксом, как в iPhone ContactApp

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)

этот блог был полезен для меня

1 голос
/ 16 июля 2017

Альтернативное решение для swift:

Чтобы сделать оба UpperCase:

например:

if ("ABcd".uppercased() == "abcD".uppercased()){
}

или сделать оба параметра LowerCase:

например:

if ("ABcd".lowercased() == "abcD".lowercased()){
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...