Rilevare se un NSString contiene ...?


124

Come posso rilevare se una stringa contiene una determinata parola? Ad esempio, ho una stringa sotto la quale si legge:

@"Here is my string."

Vorrei sapere se riesco a rilevare una parola nella stringa, ad esempio "is".


possibile duplicato di Ricerca NSString Cocoa?
kennytm,

26
puoi accettare una risposta?
Jacob Relkin,

Una soluzione economica e sporca, se si presume che la stringa non contenga punteggiatura, è concatenare gli spazi vuoti sulla parte anteriore e posteriore di ENTRAMBI le stringhe, quindi fare rangeOfString.
Hot Licks,

Risposte:


192

Ecco come lo farei:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...
   }
}

Puoi facilmente aggiungere questo come categoria su NSString:

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options;

@end

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;
}

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];
}

@end

2
In realtà puoi semplicemente aggiungere spazio all'inizio e alla fine della stringa e "is" corrisponderà alla stringa che inizia con "is"
user4951

Mi stupisce che questi non facciano parte della classe standard. Grazie, @Jacob!
big_m

1
In realtà, la "lunghezza" di NSRange dovrebbe essere testata ... non "posizione". Qui è direttamente dall'origine: "Questi metodi restituiscono la lunghezza == 0 se la stringa di destinazione non viene trovata. Quindi, per controllare il contenimento: ([ str rangeOfString: @ "target"]. length> 0). Tieni presente che la lunghezza dell'intervallo restituito da questi metodi potrebbe essere diversa dalla lunghezza della stringa target, a causa dei caratteri composti e così via. "
GtotheB,

A partire da iOS 8.0, esiste un nuovo metodo chiamato containsStringExposed in NSString.
tedyyu,

89

Utilizzare il codice seguente per scansionare la parola in frase.

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

come posso ottenere le posizioni quando utilizzo questo metodo su un array?
giudice

Dipende da cosa si sta utilizzando la ricerca nell'array. Senza usare i comparatori penso che il modo migliore sia quello di passare in rassegna l'array e controllare ogni stringa per la stringa di ricerca. NSString * searchString; for (NSString * string in array) {if ([string rangeOfString: opzioni searchString: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Non in string} else {// In questa stringa}} È quindi possibile aggiungere le stringhe che contenerlo in un nuovo array mutabile che ti consenta di mostrarli se stai cercando
simon_smiley

ps La formattazione è tutta corretta nel codice sopra ma ovviamente viene schiacciata da un commento
simon_smiley


3

Consiglio di usare NSLinguisticTagger . Possiamo usarlo per cercareHere is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTagSchemeTokenType,
                                        ]
                                                                              options:
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
 NSLinguisticTaggerJoinNames
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      tag,
                                      NSStringFromRange(tokenRange),
                                      NSStringFromRange(sentenceRange),
                                      [[linguisticTagger string] substringWithRange:tokenRange]);
                            }];

Questo produce:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

Ignora His mississippie isthmuspersino si identifica isall'interno di isn't.


3

Spero che questo ti aiuti, .. aggiungi questa riga nel file .m o crea una classe separata e integra questo codice.

@implementation NSString (Contains)

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

2

Con iOS 8 e Swift, possiamo usare il metodo localizedCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

Una soluzione completa dovrebbe prima cercare la stringa (senza spazi vuoti aggiunti), quindi verificare se il carattere immediatamente precedente è vuoto o all'inizio della riga. Allo stesso modo controlla se il carattere immediatamente successivo è vuoto o fine riga. Se entrambi i test superano, hai una corrispondenza. A seconda delle esigenze si potrebbe anche verificare la presenza di ,, ., (), etc.

Un approccio alternativo, ovviamente, è analizzare la stringa in parole e controllare ogni parola singolarmente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.