Erkennen, ob ein NSString… enthält?

124

Wie kann ich feststellen, ob eine Zeichenfolge ein bestimmtes Wort enthält? Zum Beispiel habe ich eine Zeichenfolge, die lautet:

@"Here is my string."

Ich würde gerne wissen, ob ich ein Wort in der Zeichenfolge erkennen kann, wie zum Beispiel "ist".

Alex
quelle
Mögliches Duplikat von Searching NSString Cocoa?
Kennytm
26
Kannst du eine Antwort akzeptieren?
Jacob Relkin
Eine billige und schmutzige Lösung, wenn angenommen wird, dass die Zeichenfolge keine Interpunktion enthält, besteht darin, Leerzeichen auf der Vorder- und Rückseite BEIDER Zeichenfolgen zu verketten rangeOfString.
Hot Licks

Antworten:

192

So würde ich es machen:

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...
   }
}

Sie können dies einfach als Kategorie hinzufügen zu 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
Jacob Relkin
quelle
2
Tatsächlich können Sie einfach am Anfang und Ende der Zeichenfolge Leerzeichen hinzufügen, und "is"
stimmt
Es überrascht mich, dass diese nicht zur Standardklasse gehören. Danke, @Jacob!
big_m
1
Eigentlich sollte "Länge" von NSRange getestet werden ... nicht "Ort". Hier ist es direkt von der Quelle: "Diese Methoden geben Länge == 0 zurück, wenn die Zielzeichenfolge nicht gefunden wird. Um also auf Eindämmung zu prüfen: ([ str rangeOfString: @ "target"]. length> 0). Beachten Sie, dass die Länge des von diesen Methoden zurückgegebenen Bereichs aufgrund der zusammengesetzten Zeichen und dergleichen möglicherweise von der Länge des Zielstrings abweicht. "
GtotheB
Ab iOS 8.0 gibt es eine neue Methode namens containsStringExposed in NSString.
tedyyu
89

Verwenden Sie den folgenden Code, um das Wort im Satz zu scannen.

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}
Amit Singh
quelle
Wie kann ich die Speicherorte ermitteln, wenn ich diese Methode für ein Array verwende?
Richter
Hängt davon ab, wonach Sie im Array suchen. Ohne Verwendung von Komparatoren ist es meiner Meinung nach am besten, das Array zu durchlaufen und jede Zeichenfolge auf die Suchzeichenfolge zu überprüfen. NSString * searchString; for (NSString * Zeichenfolge im Array) {if ([Zeichenfolge rangeOfString: searchString-Optionen: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Nicht in Zeichenfolge} else {// In dieser Zeichenfolge}} Anschließend können Sie die entsprechenden Zeichenfolgen hinzufügen Enthalten Sie es in einem neuen veränderlichen Array, mit dem Sie sie
anzeigen
ps Die Formatierung ist im obigen Code korrekt, wird aber offensichtlich durch einen Kommentar
unterbrochen
22

In iOS8 können Sie jetzt Folgendes verwenden:

BOOL containsString = [@"Here is my string." containsString:@"is"];

Es gibt einen interessanten Beitrag darüber, wie man es auf iOS7 "nachrüstet": http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

Geschwister
quelle
Es wäre eine sehr schöne handliche Methode. Leider ist es nicht dokumentiert und daher private API
Centurion
2
Es ist definitiv keine private API. Schauen Sie sich die Datei NSString.h an und Sie werden es sehen.
Brian Sachetta
3

Ich empfehle die Verwendung von NSLinguisticTagger . Wir können es verwenden, um zu suchenHere 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]);
                            }];

Dies gibt aus:

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

Es ignoriert His mississippiund isthmusidentifiziert sich sogar isinnerhalb von isn't.

Heidegrenzen
quelle
3

Ich hoffe, das hilft Ihnen, .. diese Zeile in die .m-Datei einzufügen oder eine separate Klasse zu erstellen und diesen Code zu integrieren.

@implementation NSString (Contains)

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

Mit iOS 8 und Swift können wir die localizedCaseInsensitiveContainsString-Methode verwenden

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

 string.localizedCaseInsensitiveContainsString(substring) // true
Govind
quelle
0

Eine vollständige Lösung würde zuerst nach der Zeichenfolge suchen (ohne hinzugefügte Leerzeichen) und dann prüfen, ob das unmittelbar vorhergehende Zeichen entweder leer oder am Zeilenanfang ist. Überprüfen Sie auf ähnliche Weise, ob das unmittelbar folgende Zeichen leer oder am Zeilenende ist. Wenn beide Tests bestanden sind, haben Sie eine Übereinstimmung. Je nach Bedarf auch für möglicherweise überprüfen ,, ., ()etc.

Ein alternativer Ansatz besteht natürlich darin, die Zeichenfolge in Wörter zu analysieren und jedes Wort einzeln zu überprüfen.

Hot Licks
quelle