Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung NSString


Antworten:


564
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

Die Dokumentation finden Sie unter Such- und Vergleichsmethoden


152
Es ist erwähnenswert, dass für den Fall, dass Sie @"Some String"von einem anderen Anruf empfangen werden und dies zufällig tun nil, Ihr ifWille trueals Senden caseInsensitiveComparean nilgültig ist und zu einem anderen führt nil, der in unserem Fall im Vergleich zu NSOrderedSameWille zurückkehrt true( NSOrderedSamedefiniert als 0). Dies kann eine Quelle ziemlich verheerender Fehler sein, wie es in meinem Fall war. Prost!
Matm

10
Meine Problemumgehung besteht darin, diesen Vergleich als Methode innerhalb einer Kategorie zu implementieren, NSStringdie einen Booleschen Wert zurückgibt. Wenn dann die empfangende Zeichenfolge ist nil, wird die Methode als Ganzes zurückgegeben NO.
Defragmentiert

50
 NSString *stringA;
 NSString *stringB;

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

Hinweis: stringA && ist erforderlich , weil , wenn stringAist nil:

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

und so passiert NSOrderedSameist auch definiert als 0.

Das folgende Beispiel ist eine typische Falle:

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }

46

Eine Alternative, wenn Sie mehr Kontrolle als nur Groß- und Kleinschreibung wünschen, ist:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Numerische Suche und diakritische Unempfindlichkeit sind zwei praktische Optionen.


4
Wie oben von matm erwähnt, gibt dies true zurück, wenn someString null ist.
nh32rg

@ nh32rg Könnten Sie einfach das falsche Positiv ausgleichen, indem Sie die if-Anweisung in etwas wieif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
Tatsächlich müssen Sie [... comapre: ...] == 0 schreiben, da compare NSOrderSame (= 0) zurückgibt, wenn zwei Zeichenfolgen gleich sind. Für someString! = (id) [NSNull null] halte ich es nicht für erforderlich, denn wenn null, dann ist die Länge null. Normalerweise vergleiche ich so: if (someString.length> 0 && [someString compare: ortherString options: NSCaseIntensitiveSearch] == 0)
Tran Quan

23

Sie können vor dem Vergleich jederzeit sicherstellen, dass sie sich im selben Fall befinden:

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

Der Hauptvorteil besteht darin, dass Sie das von matm beschriebene potenzielle Problem beim Vergleich von Nullzeichenfolgen vermeiden. Sie können entweder überprüfen, ob die Zeichenfolge nicht Null ist, bevor Sie eine der compare:options:Methoden ausführen, oder Sie können faul sein (wie ich) und die zusätzlichen Kosten für die Erstellung einer neuen Zeichenfolge für jeden Vergleich ignorieren (was minimal ist, wenn Sie nur eine ausführen oder zwei Vergleiche).


3
Das Manipulieren des Gehäuses zum Vergleichen ist normalerweise nicht ratsam (z. B. der Truthahntest: moserware.com/2008/02/does-your-code-pass-turkey-test.html ). Wenn Sie einen sprachgestützten Fallvergleich haben (z. B. caseInsensitiveCompare), verwenden Sie diesen immer.
Ohad Schneider

7
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

12
Für Menschen ist es viel nützlicher, wenn Antworten einen Kontext und eine Beschreibung haben.
Jowie

7

Ein neuer Weg, dies zu tun. iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

objC version: if (string && [string localizedCaseInsensitiveContainsString: substring])
ski_squaw

Das OP fragt nach "Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung" . Wenn Ihre Lösung truefür "Café" und "É" zurückkehrt, ist dies definitiv KEINE richtige Antwort.
Alexander Abakumov

6

Versuchen Sie diese Methode

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

Jason Cocos Antwort auf Swift für die zutiefst Faulen konvertieren :)

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}

1
Es wird für diejenigen benötigt, deren XCodes sich weigern, automatisch zu vervollständigen! : D
Nitin Alabur

5

mit dem Präfix wie in der iPhone ContactApp zu überprüfen

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

Dieser Blog war nützlich für mich


1

Alternative Lösung für schnell:

So machen Sie beide UpperCase:

z.B:

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

oder um beide LowerCase zu machen:

z.B:

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

0

Unter macOS können Sie einfach verwenden -[NSString isCaseInsensitiveLike:], was BOOLgenau wie zurückgibt -isEqual:.

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success

-3
NSMutableArray *arrSearchData;  
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];

if(r.location != NSNotFound)
{
     [arrSearchData addObject:data];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.