การเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์ NSString


240

ทุกคนสามารถบอกฉันถึงแหล่งข้อมูลใด ๆ เกี่ยวกับการเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์ใน Objective C ได้หรือไม่? ดูเหมือนจะไม่มีวิธีเทียบเท่าstr1.equalsIgnoreCase(str2)

คำตอบ:


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

เอกสารอยู่ที่วิธีการค้นหาและการเปรียบเทียบ


152
เป็นมูลค่าการกล่าวขวัญว่าในกรณีที่เมื่อ@"Some String"ได้รับจากการโทรอื่น ๆ และเกิดขึ้นเป็นnilคุณifจะให้trueการส่งcaseInsensitiveCompareไปnilเป็นที่ถูกต้องและผลลัพธ์ในการอื่นnilซึ่งในกรณีของเราเมื่อเทียบกับNSOrderedSameจะกลับtrue( NSOrderedSameถูกกำหนดเป็น 0) นี่อาจเป็นแหล่งที่มาของโรคจิตที่ร้ายแรงอย่างที่เคยเป็นในกรณีของฉัน ไชโย!
matm

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];

การค้นหาเชิงตัวเลขและการตอบโต้แบบไม่ออกเสียงเป็นสองตัวเลือกที่มีประโยชน์


4
ตามที่ระบุไว้ข้างต้นโดย matm นี้จะกลับมาจริงถ้า someString เป็นศูนย์
nh32rg

@ nh32rg คุณไม่สามารถทำสิ่งที่ผิดพลาดได้โดยเปลี่ยนคำสั่ง if เป็นอย่างif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
ที่จริงแล้วคุณต้องเขียน [... comapre: ... ] == 0 เนื่องจากการเปรียบเทียบ return NSOrderSame (= 0) ถ้าสองสายเหมือนกัน สำหรับ someString! = (id) [NSNull null] ฉันไม่คิดว่าจำเป็นเพราะถ้า null แล้วความยาวจะเป็นศูนย์ ฉันมักจะเปรียบเทียบเช่นนี้: if (someString.length> 0 && [someString เปรียบเทียบ: ตัวเลือก ortherString: NSCaseIntensitiveSearch] == 0)
Tran Quan

23

คุณสามารถมั่นใจได้ว่าพวกเขาอยู่ในกรณีเดียวกันเสมอก่อนการเปรียบเทียบ:

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

ประโยชน์หลักที่คุณหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นที่อธิบายโดย matm เกี่ยวกับการเปรียบเทียบสตริงไม่มี คุณสามารถตรวจสอบว่าสตริงไม่ได้เป็นศูนย์ก่อนที่จะทำcompare:options:วิธีใดวิธีหนึ่งหรือคุณอาจจะขี้เกียจ (อย่างฉัน) และไม่สนใจค่าใช้จ่ายเพิ่มเติมในการสร้างสตริงใหม่สำหรับการเปรียบเทียบแต่ละครั้ง หรือสองการเปรียบเทียบ)


3
การจัดการกับปลอกเพื่อเปรียบเทียบนั้นไม่ใช่เรื่องที่ควรทำ (เช่นการทดสอบไก่งวง: moserware.com/2008/02/does-your-code-pass-turkey-test.html ) เมื่อคุณมีการเปรียบเทียบกรณีที่ได้รับการสนับสนุนภาษา (เช่นcaseInsensitiveCompare) ใช้มันเสมอ
Ohad Schneider

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

12
มันมีประโยชน์กับคนมากขึ้นถ้าคำตอบมีบริบทและคำอธิบาย
jowie

7

วิธีใหม่ในการทำเช่นนี้ iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

รุ่น objC: if (สตริง && [สตริง localizedCaseInsensitiveContainsString: substring])
ski_squaw

สหกรณ์ขอ"กรณีการเปรียบเทียบความรู้สึก" หากโซลูชันของคุณกลับมาtrueเป็น "คาเฟ่" และ "É" นี่ไม่ใช่คำตอบที่ถูกต้องแน่นอน
Alexander Abakumov


6

แปลงคำตอบของ Jason Coco ให้Swiftเพื่อคนขี้เกียจอย่างสุดซึ้ง :)

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

1
มันจำเป็นสำหรับผู้ที่ XCodes ปฏิเสธการเติมข้อความอัตโนมัติ! : D
Nitin Alabur

5

เพื่อตรวจสอบกับคำนำหน้าเช่นเดียวกับใน iPhone ContactApp

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

นี้บล็อกมีประโยชน์สำหรับฉัน


1

โซลูชันสำรองสำหรับ swift:

ในการสร้างทั้งสองกรณี:

เช่น:

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.