Kaip patikrinti, ar eilutėje yra kita eilutė „Objective-C“?

Kaip patikrinti, ar eilutėje ( NSString ) yra kita mažesnė eilutė?

Tikėjausi kažką panašaus:

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

Bet arčiausiai galėčiau rasti:

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

Bet kokiu atveju, geriausias būdas sužinoti, ar eilutėje yra kita eilutė?

1096
davė Jonatanas. 2010-05-02 18:34 02 gegužės 10 d. 18:34 2010-05-02 18:34
@ 19 atsakymų
 NSString *string = @"hello bla bla"; if ([string rangeOfString:@"bla"].location == NSNotFound) { NSLog(@"string does not contain bla"); } else { NSLog(@"string contains bla!"); } 

Raktas pažymi, kad „ rangeOfString: grąžina NSRange struktūrą, o dokumentuose teigiama, kad jis grąžina struktūrą {NSNotFound, 0} jei „šieno“ nėra „adatos“.


Ir jei esate „iOS 8“ arba „OS X Yosemite“, dabar galite tai padaryti: (* PASTABA: dėl šios priežasties jūsų programa sugenda, jei šis kodas bus iškviestas „iOS7“ įrenginyje).

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

👍

2316
02 мая '10 в 19:20 2010-05-02 19:20 Atsakymą dainuoja Dave DeLong gegužės 02 d. 10 val. 20:20 2010-05-02 19:20

PASTABA. Šis atsakymas yra pasenęs.

Sukurkite NSString kategoriją:

border=0
 @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 

EDIT: žr. Toliau pateiktą Daniel Galasco komentarą dėl pavadinimo

151
09 июля '11 в 5:40 2011-07-09 05:40 atsakymas duotas P i liepos 09 '11, 5:40 2011-07-09 05:40

Kadangi tai atrodo aukšto rango rezultatas „Google“, noriu pridėti:

iOS 8 ir OS X 10.10 prideda metodą, containsString: NSString containsString: į NSString . Atnaujinta šių sistemų Dave DeLong pavyzdžio versija:

 NSString *string = @"hello bla bla"; if ([string containsString:@"bla"]) { NSLog(@"string contains bla!"); } else { NSLog(@"string does not contain bla"); } 
44
09 июня '14 в 0:14 2014-06-09 00:14 atsakymas pateikiamas Luko birželio 9 d. 14 d. 0:14 2014-06-09 00:14
 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!"); } 

// Taip pat galite naudoti:

 if (rangeValue.location == NSNotFound) { NSLog(@"string does not contain hello"); } else { NSLog(@"string contains hello!"); } 
35
27 июня '12 в 15:40 2012-06-27 15:40 atsakymą pateikė AJS birželio 27 d. 12 val. 15:40 2012-06-27 15:40

Naudodami „iOS 8“ ir „Swift“, galime naudoti lokalizuotąCaseInsensitiveContainsString metodą

  let string: NSString = "Café" let substring: NSString = "É" string.localizedCaseInsensitiveContainsString(substring) // true 
21
25 июня '14 в 11:53 2014-06-25 11:53 atsakymą iGo pateikė birželio 25 d. 14, 11:53 2014-06-25 11:53

Taigi asmeniškai aš nekenčiu NSNotFound , bet suprantu jo būtinybę.

Tačiau kai kurie žmonės negali suprasti sunkumų lyginant su NSNotFound

Pavyzdžiui, šis kodas:

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

turi savo problemų:

1) Akivaizdu, kad jei otherString = nil , šis kodas veiks. paprastas testas:

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

veda į !! CRASH !!

2) Kas nėra toks akivaizdus, ​​kad kažkas naujasis-c yra tas, kad tas pats kodas NĖRA avarijos, kai string = nil . Pavyzdžiui, šis kodas:

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

ir šis kodas:

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

abu rezultatai bus

 does string contains string - YES 

Tai aiškiai NE, ko norite.

Taigi geriausias sprendimas, kuris, mano manymu, yra, yra tas, kad „RangeOfString“ grąžina 0 ilgį, todėl kodas yra patikimesnis:

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

ARBA TIK:

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

kuri 1 ir 2 atvejais grįš

 does string contains string - NO 

Ką mano 2 centai; -)

Jei reikia daugiau naudingo kodo, perskaitykite Gist .

12
06 авг. atsakymas duotas ucangetit 06 rug . 2015-08-06 09:36 '15 at 9:36 am 2015-08-06 09:36

Patobulinta „ P i“ sprendimo versija, kategorija „NSString“, kuri ne tik pasakys, ar eilutė randama kitoje eilutėje, bet ir priima intervalą pagal nuorodą:

 @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 

Naudokite jį kaip:

 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 range NSRange range; if ([string containsString:@"ello" atRange: { NSLog(@"%@", NSStringFromRange(range)); } 
11
30 янв. Atsakymas, kurį pateikė vikingosegundo Jan 30 2013-01-30 02:48 '13, 2:48, 2013-01-30 02:48

Čia yra kopijavimo ir įklijų funkcijos fragmentas:

 -(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText { return [StrText rangeOfString:StrSearchTerm options:NSCaseInsensitiveSearch].location != NSNotFound; } 
8
29 авг. atsakymas duotas Durai Amuthan.H 29 rug . 2013-08-29 18:07 '13, 18:07 2013-08-29 18:07

Oneliner (mažiau DRY kodo, nes turite tik vieną NSLog ):

 NSString *string = @"hello bla bla"; NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 
6
30 янв. atsakymas, kurį pateikė jerik Jan 30 2013-01-30 02:21 '13 at 2:21 2013-01-30 02:21
 NSString *categoryString = @"Holiday Event"; if([categoryString rangeOfString:@"Holiday"].location == NSNotFound) { //categoryString does not contains Holiday } else { //categoryString contains Holiday } 
5
08 июля '15 в 13:44 2015-07-08 13:44 atsakymas duotas Ada liepos 08-15 dienomis 1:44 2015-07-08 13:44

pabandykite

4
02 сент. Atsakymą pateikė Pooja Patel 02 Sep. 2015-09-02 12:48 '15 , 12:48 2015-09-02 12:48

Greito naudojimo atveju jį galima naudoti.

 let string = "Package #23" if string.containsString("Package #") { //String contains substring } else { //String does not contain substring } 
3
24 февр. atsakymas pateikiamas sreedeep kesav . 2016-02-24 11:35 '16 at 11:35 2016-02-24 11:35

Jei reikia, rašykite:

 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; 
3
24 апр. atsakymą pateikė Nikolajus Šubenkovas 24 d. 2015-04-24 17:00 „15, 17 val. 2015-04-24 17:00

Geriausias sprendimas. Kaip paprasta! Jei norite rasti žodį ar eilutės dalį. Galite naudoti šį kodą. Šiame pavyzdyje mes patikrinsime, ar žodžio „acter“ vertė.

 NSString *word =@"find a word or character here"; if ([word containsString:@"acter"]){ NSLog(@"It contains acter"); } else { NSLog (@"It does not contain acter"); } 
3
22 авг. atsakymas, kurį pateikė handiansom 22 rug . 2016-08-22 09:05 '16 at 9:05 am 2016-08-22 09:05

Jei nesate susirūpinęs dėl didžiosios ir mažosios raidės. Išbandykite vieną kartą.

 NSString *string = @"Hello World!"; if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound) { NSLog(@"found"); } else { NSLog(@"not found"); } 
2
08 июня '15 в 8:48 2015-06-08 08:48 atsakymą pateikė „ Abhijit “ birželio 8 d. 15 d. 8:48 2015-06-08 08:48
 NSString *colorKey = @"I am feeling BLUE"; if ([colorKey rangeOfString:@"blue" options:NSCaseInsensitiveSearch].location != NSNotFound) { NSLog(@"found the blue"); } 
1
03 дек. Atsakymą pateikė Rohit Kashyap 03 d. 2017-12-03 06:15 '17 at 6:15 am 2017-12-03 06:15

„Swift“ 4

tegul a = "Sveiki, kaip tu?"

a.contains („Hello“) // true

1
12 окт. Atsakymą pateikė Ankit garg spalio 12 d. 2017-10-12 21:47 '17 at 21:47 2017-10-12 21:47

Prašome naudoti šį kodą.

1
01 авг. Atsakyti Rohit suvagiya 01 rug . 2015-08-01 09:01 '15 at 9:01 AM 2015-08-01 09:01

Jei reikalinga tam tikra linijos padėtis, šis kodas pateikiamas „ Swift 3.0“ :

 let string = "This is my string" let substring = "my" let position = string.range(of: substring)?.lowerBound 
-2
04 сент. Atsakymas pateikiamas pedrouan 04 sep . 2016-09-04 18:29 '16 at 18:29 pm 2016-09-04 18:29

Kiti klausimai apie „ žymes arba užduoti klausimą