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


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

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");
}

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/


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.


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

2

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.