Trường hợp so sánh không nhạy cảm NSString


240

Bất cứ ai cũng có thể chỉ cho tôi bất kỳ tài nguyên nào về so sánh không nhạy cảm trong trường hợp trong Mục tiêu C không? Nó dường như không có một phương pháp tương đương vớistr1.equalsIgnoreCase(str2)

Câu trả lời:


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

Tài liệu được đặt tại Phương pháp tìm kiếm và so sánh


152
Điều đáng nói là trong trường hợp khi @"Some String"nhận được từ bất kỳ cuộc gọi khác và sẽ xảy ra là nil, bạn ifsẽ cung cấp cho truenhư gửi caseInsensitiveComparetới nillà hợp lệ và kết quả trong một nilmà, trong trường hợp của chúng tôi, so với NSOrderedSamesẽ trở lại true( NSOrderedSameđược định nghĩa là 0). Đây có thể là một nguồn của các lỗi khá tàn phá, như trong trường hợp của tôi. Chúc mừng!
mat

10
Cách giải quyết của tôi cho việc này là thực hiện so sánh đó như là một phương thức bên trong một danh mục trên NSStringđó trả về một giá trị boolean. Sau đó, nếu chuỗi nhận là nil, toàn bộ phương thức trả về NO.
Chống phân mảnh

50
 NSString *stringA;
 NSString *stringB;

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

Lưu ý: stringA && là cần thiết vì khi stringAnil:

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

và vì vậy xảy ra NSOrderedSamecũng được định nghĩa là 0.

Ví dụ sau đây là một cạm bẫy điển hình:

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

46

Một thay thế nếu bạn muốn kiểm soát nhiều hơn chỉ là trường hợp không nhạy cảm là:

[someString compare:otherString options:NSCaseInsensitiveSearch];

Tìm kiếm số và vô cảm dấu phụ là hai tùy chọn tiện dụng.


4
Như đã lưu ý ở trên bởi matm, điều này sẽ trả về true nếu someString không.
nh32rg

@ nh32rg Có thể bạn chỉ cần bù đắp cho dương tính giả, bằng cách thay đổi câu lệnh if thành một cái gì đó giống nhưif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
thực tế, bạn cần phải viết [... comapre: ...] == 0, vì so sánh trả về NSOrderSame (= 0) nếu hai chuỗi giống nhau. for, someString! = (id) [NSNull null], tôi không nghĩ rằng nó là bắt buộc, bởi vì nếu null, thì độ dài bằng không. Tôi thường so sánh như thế này: if (someString.length> 0 && [someString so sánh: ortherString tùy chọn: NSCaseIntensitiveSearch] == 0)
Tran Quan

23

Bạn luôn có thể đảm bảo chúng trong cùng một trường hợp trước khi so sánh:

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

Lợi ích chính là bạn tránh được vấn đề tiềm ẩn được mô tả bởi matm liên quan đến việc so sánh các chuỗi số không. Bạn có thể kiểm tra chuỗi không trước khi thực hiện một trong các compare:options:phương thức hoặc bạn có thể lười biếng (như tôi) và bỏ qua chi phí bổ sung để tạo chuỗi mới cho mỗi so sánh (tối thiểu nếu bạn chỉ thực hiện một phương pháp hoặc hai so sánh).


3
Thao tác với vỏ để so sánh thường không phải là một việc làm khôn ngoan (ví dụ: kiểm tra gà tây: moserware.com/2008/02/does-your-code-pass-turkey-test.html ). Khi bạn có so sánh trường hợp được hỗ trợ bằng ngôn ngữ (như caseInsensitiveCompare), hãy luôn sử dụng nó.
Ohad Schneider

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

12
Nó hữu ích hơn nhiều cho mọi người nếu câu trả lời có một số bối cảnh và mô tả.
jowie

7

Một cách mới để làm điều này. iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

phiên bản objC: if (chuỗi && [chuỗi localizedCaseInsensitiveContainsString: chuỗi con])
Ski_squaw

OP yêu cầu "So sánh không nhạy cảm trường hợp" . Nếu giải pháp của bạn trả về truecho "Café" và "É", đây chắc chắn KHÔNG phải là một câu trả lời đúng.
Alexander Abakumov

6

Hãy thử phương pháp này

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

Chuyển đổi câu trả lời của Jason Coco thành Swift cho sự lười biếng sâu sắc :)

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

1
nó cần thiết cho những người có XCodes từ chối tự động hoàn tất! : D
Nitin Alabur 17/2/2017

5

để kiểm tra với tiền tố như trong iPhone ContactApp

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

này trên blog là hữu ích cho tôi


1

Giải pháp thay thế cho swift:

Để tạo cả UpperCase:

ví dụ:

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

hoặc để tạo cả LowerCase:

ví dụ:

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

0

Trên macOS bạn chỉ cần sử dụng -[NSString isCaseInsensitiveLike:], nó sẽ trả về BOOLnhư thế -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];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.