大文字小文字を区別しない比較NSString


回答:


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

ドキュメントは検索と比較方法にあります


152
それは場合にすることを言及する価値がある@"Some String"他のコールから受信したことを起こるされnil、あなたがif与えるtrue送信などcaseInsensitiveComparenil有効であり、他で結果nil我々の場合には、と比較して、NSOrderedSame返しますtrueNSOrderedSame0と定義されます)。これは、私の場合のように、非常に壊滅的なバグの原因となる可能性があります。乾杯!
11

10
これに対する私の回避策は、その比較をNSStringブール値を返すカテゴリ内のメソッドとして実装することです。次に、受信文字列がのnil場合、メソッドは全体として戻りますNO
デフラグ

50
 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

大文字と小文字を区別しないだけでなく、より詳細な制御が必要な場合の代替策は次のとおりです。

[someString compare:otherString options:NSCaseInsensitiveSearch];

数値検索と分音無感覚は、2つの便利なオプションです。


4
上記のmatmで述べたように、someStringがnilの場合、これはtrueを返します。
nh32rg 2013

@ nh32rg ifステートメントを次のように変更して、誤検知を補うことができますかif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
実際には、[... comapre:...] == 0と記述する必要があります。これは、2つの文字列が同じ場合、比較によってNSOrderSame(= 0)が返されるためです。for、someString!=(id)[NSNull null]、それが必要だとは思いません。nullの場合、長さはゼロだからです。私は通常、次のように比較します。if(someString.length> 0 && [someString compare:ortherString options:NSCaseIntensitiveSearch] == 0)
Tran Quan

23

比較する前に、常に同じケースであることを確認できます。

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

主な利点は、nil文字列の比較に関してmatmによって説明される潜在的な問題を回避できることです。compare:options:メソッドの1つを実行する前に文字列がnilでないことを確認するか、または(私のように)怠惰で、比較ごとに新しい文字列を作成する追加のコストを無視することができます(1つだけを実行している場合は最小限です)または2つの比較)。


3
比較のためにケースを操作することは通常賢明なことではありません(たとえば、トルコのテスト:moserware.com/2008/02/does-your-code-pass-turkey-test.html)。言語対応の大/小文字比較(などcaseInsensitiveCompare)がある場合は、常にそれを使用してください。
Ohad Schneider

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

12
回答にコンテキストと説明がある場合、それは人々にとってはるかに有用です。
ジョウイ

7

これを行う新しい方法。iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

objCバージョン:if(string && [string localizeCaseInsensitiveContainsString:substring])
ski_squaw

OPは「大文字と小文字を区別しない比較」を要求します。ソリューションがtrue「カフェ」と「É」に戻る場合、これは間違いなく正しい答えではありません
Alexander Abakumov

6

この方法を試してください

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

非常に怠惰な:)のためにジェイソンココの回答をスウィフトに変換する

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

1
XCodeがオートコンプリートを拒否する場合に必要です。:D
Nitin Alabur 2017

5

iPhoneのContactAppのようにプレフィックスで確認する

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

このブログは私にとって役に立ちました


1

迅速な代替ソリューション:

両方のUpperCaseを作成するには:

例えば:

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

または両方のLowerCaseを作成するには:

例えば:

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

0

MacOSで、あなたは、単に使用することができます-[NSString isCaseInsensitiveLike:]返す、BOOL同じように-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];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.