मैं कैसे जांच करूं कि एक स्ट्रिंग में ऑब्जेक्टिव-सी में एक और स्ट्रिंग है?


1212

अगर एक स्ट्रिंग ( NSString) में एक और छोटी स्ट्रिंग है तो मैं कैसे जांच सकता हूं ?

मैं कुछ इस तरह की उम्मीद कर रहा था:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);

लेकिन मुझे जो सबसे करीब मिल सकता था, वह था:

if ([string rangeOfString:@"hello"] == 0) {
    NSLog(@"sub string doesnt exist");
} 
else {
    NSLog(@"exists");
}

वैसे भी, यह पता लगाने का सबसे अच्छा तरीका है कि क्या एक स्ट्रिंग में एक और स्ट्रिंग है?


1
मैं इसे भी जोड़ना चाहता हूं, लेकिन इस बीच इसे NSString पर एक श्रेणी के रूप में जोड़ना अपेक्षाकृत आसान है।
इसहाक

2
if ([string rangeOfString:@"hello"] == 0) {...}NSRange और int के लिए एक प्रकार की बेमेल त्रुटि का उपयोग करना । इसे ठीक करने के लिए, आपको लाइन को निम्न में बदलना चाहिए:if ([string rangeOfString:@"hello"].length == 0) {...}
नेकु

1
iOS 8 में शामिल हैं: String
स्टीव मोसर

2
मैं शुरुआत से ही iOS डेवलपर रहा हूं और मैं लगातार इस पोस्ट को क्विक कॉपी पेस्ट के लिए रिवाइज करता हूं। मैं इसे याद नहीं कर सकता। मेरे इतिहास में सबसे अधिक देखी जाने वाली स्टैकओवरफ़्लो पोस्ट है।
वेपरवेयरवुल्फ

बस स्विफ्ट का उपयोग करें;)
फेटी

जवाबों:


2436
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}

कुंजी सूचित कर रही है कि rangeOfString:एक NSRangeसंरचना लौटाती है , और प्रलेखन का कहना है कि यह संरचना को वापस लौटाता है {NSNotFound, 0}यदि "हेयस्टैक" में "सुई" शामिल नहीं है।


और यदि आप iOS 8 या OS X Yosemite पर हैं, तो आप अब कर सकते हैं: (* नोट: यदि यह कोड iOS7 डिवाइस पर कहा जाता है) तो यह आपके ऐप को क्रैश कर देगा।

NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
  NSLog(@"string contains bla!");
} else {
  NSLog(@"string does not contain bla");
}

(यह भी है कि यह स्विफ्ट में कैसे काम करेगा)

👍


286
केस असंवेदनशील खोज का उपयोग करने के लिए "यदि ([स्ट्रिंग रेंजऑफ़स्ट्रिंग: @" bla "विकल्प: NSCaseInsensitiveSearch] .location! = NSNotFound)"
Vanja

1
@ डेवॉन्ग मैं सिर्फ एक श्रेणी का उल्लेख करने जा रहा था जिसे मैंने इस उद्देश्य के लिए बनाया था इससे पहले कि मैं आपके उत्तर को संपादित करूं! चूंकि मैं मुख्य रूप से एसी # डेवलपर हूं इसलिए मुझे खुशी है कि उन्होंने NSSTring में एक विधि जोड़ी।
dherrin79

यदि मेरा तैनाती लक्ष्य iOS7 है और मैं इसमें शामिल हैं, तो कंपाइलर कुछ भी क्यों नहीं कहता?
रिकार्डो

3
और @Vanja द्वारा किए गए बिंदु को आगे बढ़ाने के लिए: यदि आप iOS 8 / योसेमाइट में [स्ट्रिंग शामिल है] शॉर्टकट कोड का उपयोग करने जा रहे हैं, तो आप किसी असंवेदनशील स्ट्रिंग के लिए निम्न कोड का उपयोग कर सकते हैं: "[stringSoSearch localizedCaseInsensitiveContainsString: string: ] ", और यह एक अगर आप एक केस करना चाहते हैं और डियाक्रिटिक असंवेदनशील खोज:" [stringToSearch localizedStandardContainsString: string] "।
स्कॉट कोहलर्ट

1
ध्यान दें कि स्ट्रिंग [string rangeOfString:@"bla"].location != NSNotFoundहोने पर अभिव्यक्ति सही होगी nil!
फफूंद

158

IOS 8.0+ और macOS 10.10+ के लिए, आप NSString के मूल का उपयोग कर सकते हैं containsString:

IOS और macOS के पुराने संस्करणों के लिए, आप NSString के लिए अपनी खुद की (अप्रचलित) श्रेणी बना सकते हैं:

@interface NSString ( SubstringSearch )
    - (BOOL)containsString:(NSString *)substring;
@end

// - - - - 

@implementation NSString ( SubstringSearch )

- (BOOL)containsString:(NSString *)substring
{    
    NSRange range = [self rangeOfString : substring];
    BOOL found = ( range.location != NSNotFound );
    return found;
}

@end

नोट: नामकरण के संबंध में नीचे डैनियल गैलास्को की टिप्पणी का निरीक्षण करें


13
+1 परिणामी कोड और पुन: प्रयोज्य परिणाम को साफ़ करने के लिए। मैंने इसे एक लाइनर में बदल दिया return [self rangeOfString:substring].location != NSNotFound;और इसे अपनी रिफैक्टिंग लाइब्रेरी, es_ios_utils में शामिल किया। github.com/peterdeweese/es_ios_utils
पीटर डिविज़

4
ऐसा लगता है कि Apple को आपका विचार पसंद आया और उसने iOS 8 और OSx 10.10 (Yosemite) में इस सुविधा को जोड़ा जैसा कि @DaveDeLong ने अपने उत्तर में बताया है। +1
इस्लाम Q.

7
Obj-c श्रेणियों के लिए कार्डिनल नियम आपके 3 अक्षर मॉड्यूल उपसर्ग के साथ विधि नाम को उपसर्ग करना है। यह सही उदाहरण है क्योंकि अब यह iOS 7 और 10.10 रिलीज के साथ संघर्ष करता है
डैनियल गैलास्को

54

चूंकि यह Google में उच्च रैंकिंग वाला परिणाम प्रतीत होता है, इसलिए मैं इसे जोड़ना चाहता हूं:

iOS 8 और OS X 10.10 में containsString:विधि जोड़ें NSString। उन सिस्टमों के लिए डेव देलांग के उदाहरण का एक अद्यतन संस्करण:

NSString *string = @"hello bla bla";
if ([string containsString:@"bla"]) {
    NSLog(@"string contains bla!");
} else {
    NSLog(@"string does not contain bla");
}

39
NSString *myString = @"hello bla bla";
NSRange rangeValue = [myString rangeOfString:@"hello" options:NSCaseInsensitiveSearch];

if (rangeValue.length > 0)
{
    NSLog(@"string contains hello");
} 
else 
{
    NSLog(@"string does not contain hello!");
}

// आप वैकल्पिक रूप से निम्नलिखित का भी उपयोग कर सकते हैं:

if (rangeValue.location == NSNotFound) 
{
    NSLog(@"string does not contain hello");
} 
else 
{
    NSLog(@"string contains hello!");
}

22

साथ iOS 8 और स्विफ्ट , हम उपयोग कर सकते हैं localizedCaseInsensitiveContainsString विधि

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

 string.localizedCaseInsensitiveContainsString(substring) // true

1
यह अच्छा है। पता नहीं क्यों वे ios 7 के लिए इस विधि नहीं था
Lucas

@ लुकास, क्योंकि स्विफ्ट को iOS 8.0 के साथ लॉन्च किया गया था। लेकिन तेजी के साथ आप अभी भी iOS 7 के साथ डिवाइस का समर्थन कर सकते हैं
हेमंग

13

इसलिए व्यक्तिगत रूप से मैं वास्तव में नफरत करता हूं NSNotFoundलेकिन इसकी आवश्यकता को समझता हूं ।

लेकिन कुछ लोग NSNotFound के खिलाफ तुलना करने की जटिलताओं को नहीं समझ सकते हैं

उदाहरण के लिए, यह कोड:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

इसकी समस्याएं हैं:

1) जाहिर है अगर otherString = nilयह कोड दुर्घटनाग्रस्त हो जाएगा। एक साधारण परीक्षा होगी:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

का परिणाम !! दुर्घटना !!

2) वस्तुनिष्ठ-ग के लिए किसी के लिए क्या इतना स्पष्ट नहीं है कि एक ही कोड दुर्घटनाग्रस्त नहीं होगा string = nil। उदाहरण के लिए, यह कोड:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

और यह कोड:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

दोनों में परिणाम होगा

does string contains string - YES

जो स्पष्ट रूप से नहीं है कि आप क्या चाहते हैं।

तो मुझे लगता है कि काम करता है कि बेहतर समाधान तथ्य का उपयोग करने के लिए है कि रेंजऑफस्ट्रिंग 0 की लंबाई लौटाता है तो एक बेहतर अधिक विश्वसनीय कोड यह है:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

या केवल:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

जो मामलों 1 और 2 के लिए वापस आ जाएगा

does string contains string - NO

यह मेरा 2 सेंट है ;-)

कृपया अधिक उपयोगी कोड के लिए मेरे जिस्ट की जाँच करें ।


12

P i के समाधान का एक उन्नत संस्करण , NSString पर एक श्रेणी, जो न केवल बताएगा, अगर एक स्ट्रिंग दूसरे स्ट्रिंग के भीतर पाई जाती है, बल्कि संदर्भ द्वारा एक सीमा भी लेती है:

@interface NSString (Contains)
-(BOOL)containsString: (NSString*)substring
              atRange:(NSRange*)range;

-(BOOL)containsString:(NSString *)substring;
@end

@implementation NSString (Contains)

-(BOOL)containsString:(NSString *)substring
              atRange:(NSRange *)range{

    NSRange r = [self rangeOfString : substring];
    BOOL found = ( r.location != NSNotFound );
    if (range != NULL) *range = r;
    return found;
}

-(BOOL)containsString:(NSString *)substring
{
    return [self containsString:substring
                        atRange:NULL];
}

@end

इसका उपयोग करें जैसे:

NSString *string = @"Hello, World!";

//If you only want to ensure a string contains a certain substring
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"YES");
}

// Or simply
if ([string containsString:@"ello"]) {
    NSLog(@"YES");
}

//If you also want to know substring's range
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}

8

यहाँ एक कॉपी-और-पेस्ट फ़ंक्शन स्निपेट है:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}

क्या मुझे पता है कि मुझे क्यों उखाड़ा गया है? यह एक वर्किंग कोड स्निपेट है
दुरई अमूथन।

6

Oneliner (कोड की छोटी राशि। DRY, जैसा कि आपके पास केवल एक है NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 

6
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}

5

इसे इस्तेमाल करे,

NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound) 
{
    NSLog(@"string does not contain Data");
}   
else 
{
    NSLog(@"string contains data!");
}

5

सबसे अच्छा उपाय। इस के रूप में सरल! यदि आप एक शब्द या स्ट्रिंग का हिस्सा खोजना चाहते हैं। आप इस कोड का उपयोग कर सकते हैं। इस उदाहरण में हम जांचने जा रहे हैं कि क्या शब्द के मूल्य में "अभिनेता" है।

NSString *word =@"find a word or character here";
if ([word containsString:@"acter"]){
    NSLog(@"It contains acter");
} else {
     NSLog (@"It does not contain acter");
}


4

यदि आपको एक बार यह लिखने की आवश्यकता है:

NSString *stringToSearchThrough = @"-rangeOfString method finds and returns the range of the first occurrence of a given string within the receiver.";
BOOL contains = [stringToSearchThrough rangeOfString:@"occurence of a given string"].location != NSNotFound;

4

स्विफ्ट के मामले में, इसका उपयोग किया जा सकता है

let string = "Package #23"
if string.containsString("Package #") {
    //String contains substring
}
else {
    //String does not contain substring
}

2

यदि केस-संवेदी स्ट्रिंग के बारे में परेशान न करें। एक बार यह कोशिश करो।

NSString *string  = @"Hello World!";

if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    NSLog(@"found");
}
else
{
    NSLog(@"not found");
}

1

कृपया इस कोड का उपयोग करें

NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) 
{
    NSLog(@"string does not contain bla");
} 
else 
{  
    NSLog(@"string contains bla!");
}

1

विकल्प का उपयोग करें NSCaseInsensitiveSearch with रेंजऑफस्ट्रिंग: विकल्प:

NSString *me = @"toBe" ;
NSString *target = @"abcdetobe" ;
NSRange range = [target  rangeOfString: me options: NSCaseInsensitiveSearch];
NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No");
if (range.location != NSNotFound) {
// your code
}

आउटपुट परिणाम पाया जाता है: हाँ

विकल्प एक साथ "or'ed" हो सकते हैं और इसमें शामिल हैं:

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch और बहुत कुछ


0

पहली स्ट्रिंग में दूसरी स्ट्रिंग होती है या नहीं,

NSString *first = @"Banana";
NSString *second = @"BananaMilk";
NSRange range = [first rangeOfString:second options:NSCaseInsensitiveSearch];

if (range.length > 0) {
    NSLog(@"Detected");
}
else {
    NSLog(@"Not detected");
}

0

इसे इस्तेमाल करे:

स्विफ्ट 4.1, 4.2:

let stringData = "Black board"

//swift quick way and case sensitive
if stringData.contains("bla") {
    print("data contains string");
}

//case sensitive
if stringData.range(of: "bla",options: .caseInsensitive) != nil {
    print("data contains string");
}else {
    print("data does not contains string");
}

उद्देश्य-सी के लिए:

NSString *stringData = @"Black board";

//Quick way and case sensitive
if ([stringData containsString:@"bla"]) {
    NSLog(@"data contains string");
}

//Case Insensitive
if ([stringData rangeOfString:@"bla" options:NSCaseInsensitiveSearch].location != NSNotFound) {
   NSLog(@"data contains string");
}else {
   NSLog(@"data does not contain string");
}

0

स्विफ्ट 4 और उससे ऊपर

let str = "Hello iam midhun"

if str.contains("iam") {
  //contains substring
}
else {
  //doesn't contain substring
}

उद्देश्य सी

NSString *stringData = @"Hello iam midhun";

if ([stringData containsString:@"iam"]) {
    //contains substring
}
else {
    //doesn't contain substring
}

-1
-(Bool)checkIf:(String)parentString containsSubstring:(String)checkString {
    NSRange textRange =[parentString rangeOfString:checkString];
    return textRange.location != NSNotFound // returns true if parent string contains substring else returns false
  }

1
ऑब्जेक्टिव-सी में हमारे पास 'एनएसएसट्रिंग' टाइप होता है। हमारे पास Stringटाइप नहीं है । दूसरे, हमारे पास सभी वस्तुएं हैं। तो एक तर्क के रूप में आपको पास होना चाहिए NSString। अत्यधिक सक्रिय प्रश्न के तहत एक उत्तर की खराब गुणवत्ता के कारण मैं विलोपन के लिए मतदान करता हूं।
अलेक्सी पोटापोव

-2

यदि स्ट्रिंग की निश्चित स्थिति की आवश्यकता है, तो यह कोड स्विफ्ट 3.0 में आता है :

let string = "This is my string"
let substring = "my"

let position = string.range(of: substring)?.lowerBound
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.