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

240

Kann mich jemand auf Ressourcen zum Vergleich von Groß- und Kleinschreibung in Ziel C hinweisen? Es scheint keine äquivalente Methode zu habenstr1.equalsIgnoreCase(str2)

Tejaswi Yerukalapudi
quelle

Antworten:

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

Die Dokumentation finden Sie unter Such- und Vergleichsmethoden

Jason Coco
quelle
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
 }
Oh ho
quelle
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.

nach vorne gezogen
quelle
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).

Chris Wooden
quelle
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
Wirbelwind
quelle
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
Govind
quelle
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
Reena
quelle
6

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

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
Tasik
quelle
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

Ich selbst
quelle
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()){
}
FARAZ
quelle
0

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

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success
mangerlahn
quelle
-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];
}
ABC
quelle