Büyük / küçük harfe duyarlı olmayan karşılaştırma


240

Herhangi biri beni Amaç C'deki büyük / küçük harfe duyarlı olmayan karşılaştırmayla ilgili herhangi bir kaynağa yönlendirebilir mi? Eşdeğer bir yöntemi yok gibi görünüyorstr1.equalsIgnoreCase(str2)

Yanıtlar:


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

Belgeler Arama ve Karşılaştırma Yöntemleri'nde bulunmaktadır


152
Bu durumda o bahsetmemiz olan @"Some String"herhangi bir başka çağrıdan alınan ve olur edilir nil, sizin ifverecek truegönderme gibi caseInsensitiveComparehiç nilgeçerlidir ve başka sonuç nilbizim durumumuzda, ile karşılaştırıldığında, hangi NSOrderedSamedönecektir true( NSOrderedSame0 olarak tanımlanır). Benim durumumda olduğu gibi bu oldukça yıkıcı hataların kaynağı olabilir. Şerefe!
matm

10
Bunun için benim geçici çözüm, bu karşılaştırmayı NSStringbir boole döndüren bir kategori içinde bir yöntem olarak uygulamaktır . Sonra alıcı dize, nilbir bütün olarak yöntem döndürür NO.
defragged

50
 NSString *stringA;
 NSString *stringB;

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

Not: stringA && çünkü ne zaman gereklidir stringAise nil:

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

ve böyle olur NSOrderedSameda olarak tanımlanır 0.

Aşağıdaki örnek tipik bir tuzaktır:

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

46

Sadece büyük / küçük harf duyarsızlığından daha fazla kontrol istiyorsanız alternatif:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Sayısal arama ve aksan duyarlılığı iki kullanışlı seçenektir.


4
Matm tarafından yukarıda belirtildiği gibi, someString sıfırsa bu doğru olacaktır.
nh32rg

@ nh32rg if-ifadesini aşağıdaki gibi bir şeye değiştirerek yanlış pozitif telafi edebilir misinizif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
aslında, iki dize aynıysa, dönüş NSOrderSame (= 0) değerini karşılaştırdığından [... comapre: ...] == 0 yazmanız gerekir. için, someString! = (id) [NSNull null], gerekli olduğunu düşünmüyorum, çünkü null ise, uzunluk sıfırdır. Genellikle şu şekilde karşılaştırırım: if (someString.length> 0 && [someString karşılaştırması: ortherString seçenekleri: NSCaseIntensitiveSearch] == 0)
Tran Quan

23

Karşılaştırma işleminden önce her zaman aynı durumda olduklarından emin olabilirsiniz:

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

En büyük yararı, sıfır dizelerini karşılaştırma konusunda matm tarafından açıklanan potansiyel sorundan kaçınmanızdır. compare:options:Yöntemlerden birini yapmadan önce dizenin sıfır olmadığını kontrol edebilir veya tembel olabilirsiniz (benim gibi) ve her karşılaştırma için yeni bir dize oluşturma ek maliyetini göz ardı edebilirsiniz (yalnızca bir tane yapıyorsanız minimumdur) veya iki karşılaştırma).


3
Muhafazayı karşılaştırmak için manipüle etmek genellikle akıllıca bir şey değildir (örneğin, türkiye testi: moserware.com/2008/02/does-your-code-pass-turkey-test.html ). Dil destekli vaka karşılaştırmanız varsa (örneğin caseInsensitiveCompare) her zaman bunu kullanın.
Ohad Schneider

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

12
Yanıtların bir bağlamı ve açıklaması varsa, insanlar için çok daha yararlıdır.
jowie

7

Bunu yapmanın yeni bir yolu. iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

objC sürümü: if (string && [string localizedCaseInsensitiveContainsString: substring])
ski_squaw

OP, "Büyük / küçük harf duyarsız karşılaştırma" ister . Çözümünüz true"Café" ve "É" için geri dönüyorsa, bu kesinlikle doğru bir cevap DEĞİLDİR .
Alexander Abakumov

6

Bu yöntemi deneyin

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

Jason Coco'nun Swift'e verdiği cevabı son derece tembel hale getirmek :)

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

1
XCodes otomatik tamamlamayı reddedenler için gerekli! : D
Nitin Alabur

5

iPhone ile ilgili öneki kontrol etmek için

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

bu blog benim için yararlı oldu


1

Hızlı alternatif çözüm:

Her iki UpperCase'i yapmak için:

Örneğin:

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

veya LowerCase'i yapmak için:

Örneğin:

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

0

MacOS'ta -[NSString isCaseInsensitiveLike:], BOOLtıpkı şu şekilde dönen basitçe kullanabilirsiniz -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];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.