केस असंवेदनशील तुलना NSString


240

उद्देश्य सी में असंवेदनशील तुलना के मामले में क्या कोई मुझे किसी भी संसाधन की ओर इशारा कर सकता है? यह करने के लिए एक समकक्ष विधि है प्रतीत नहीं होता है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( NSOrderedSame0 के रूप में परिभाषित किया गया है)। यह काफी विनाशकारी कीड़े का स्रोत हो सकता है, जैसा कि मेरे मामले में था। चीयर्स!
मटमैला

10
इसके लिए मेरा वर्कअराउंड उस श्रेणी के अंदर एक विधि के रूप में उस तुलना को लागू करना है जो NSStringएक बूलियन देता है। फिर यदि प्राप्त करने वाला स्ट्रिंग है nil, तो विधि पूरे रिटर्न के रूप में है NO
defragged

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
जैसा कि ऊपर मैट द्वारा उल्लेख किया गया है, यह सच हो जाएगा अगर कुछ स्ट्रिंग शून्य है।
n32

@ nh32rg क्या आप सिर्फ झूठे सकारात्मक के लिए नहीं बना सकते हैं, अगर बयान को बदलकर कुछ इस तरह किया जाएif ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
वास्तव में, आपको लिखने की जरूरत है [... comapre: ...] == 0, क्योंकि वापसी NSOrderSame (= 0) की तुलना करें यदि दो तार समान हैं। for, someString! = (id) [NSNull null], मुझे नहीं लगता कि इसकी आवश्यकता है, क्योंकि यदि अशक्त है, तो, लंबाई शून्य है। मैं आमतौर पर इस तरह की तुलना करता हूं: अगर (someString.length> 0 && [someString तुलना करें: ortherString विकल्प: NSCaseIntensitiveSearch] == 0)
Tran Quan

23

आप हमेशा तुलना से पहले एक ही मामले में सुनिश्चित कर सकते हैं:

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

मुख्य लाभ आप शून्य स्ट्रिंग्स की तुलना के बारे में मैट द्वारा वर्णित संभावित मुद्दे से बचते हैं। आप compare:options:विधियों में से किसी एक को करने से पहले स्ट्रिंग की जांच नहीं कर सकते हैं, या आप आलसी (मेरे जैसे) हो सकते हैं और प्रत्येक तुलना के लिए एक नया स्ट्रिंग बनाने की अतिरिक्त लागत को अनदेखा कर सकते हैं (जो कि न्यूनतम है यदि आप केवल एक कर रहे हैं या दो तुलना)।


3
तुलना करने के लिए आवरण को हेरफेर करना आमतौर पर करने के लिए एक बुद्धिमान बात नहीं है (जैसे, टर्की परीक्षण: moserware.com/2008/02/does-your-code-pass-turkey-test.html )। जब आपके पास भाषा-समर्थित केस तुलना (जैसे caseInsensitiveCompare), हमेशा उस का उपयोग करें।
ओहद श्नाइडर

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

12
यदि उत्तर में कुछ संदर्भ और विवरण हैं तो यह लोगों के लिए अधिक उपयोगी है।
जूली 16'12

7

ऐसा करने का एक नया तरीका। iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

objC संस्करण: if (string && [string localizedCaseInsensitiveContainsString: substring])
स्की_squaw

ओपी "केस असंवेदनशील तुलना" के लिए पूछता है । यदि आपका समाधान true"कैफे" और "," के लिए वापस आता है , तो यह निश्चित रूप से सही उत्तर नहीं है।
अलेक्जेंडर अबाकुमोव

6

इस विधि को आजमाएं

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

गंभीर रूप से आलसी के लिए स्विफ्ट को जेसन कोको के उत्तर को परिवर्तित करना :)

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

1
इसकी जरूरत उन लोगों के लिए है जिनके एक्सकोड स्वत: पूर्ण होने से इनकार करते हैं! : डी
नितिन अल्बूर

5

iPhone के रूप में उपसर्ग के साथ संपर्क करने के लिए संपर्क करें

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

यह ब्लॉग मेरे लिए उपयोगी था


1

स्विफ्ट के लिए वैकल्पिक समाधान:

दोनों अपरकेस बनाने के लिए:

उदाहरण के लिए:

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

या लोअरकेस दोनों बनाने के लिए:

उदाहरण के लिए:

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];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.