1281 Stimmen

Wie überprüfe ich, ob ein String einen anderen String in Objective-C enthält?

Wie kann ich überprüfen, ob ein String (NSString) einen anderen kleineren String enthält?

Ich hatte gehofft, etwas Ähnliches zu finden:

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

Aber das Nächste, was ich finden konnte, war:

if ([string rangeOfString:@"hallo"] == 0) {
    NSLog(@"Teil-String existiert nicht");
} 
else {
    NSLog(@"existiert");
}

Ist das jedenfalls die beste Methode, um festzustellen, ob ein String einen anderen String enthält?

13voto

ucangetit Punkte 2545

Also persönlich hasse ich NSNotFound wirklich, aber verstehe seine Notwendigkeit.

Aber einige Leute könnten die Komplexitäten des Vergleichs gegen NSNotFound möglicherweise nicht verstehen

Zum Beispiel dieser Code:

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

hat seine Probleme:

1) Offensichtlich wird dieser Code abstürzen, wenn otherString = nil. Ein einfacher Test wäre:

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

ergeben !! ABSTURZ !!

2) Was für jemanden, der neu in Objective-C ist, nicht so offensichtlich ist, ist dass derselbe Code NICHT abstürzt, wenn string = nil. Zum Beispiel dieser Code:

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

und dieser Code:

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

ergeben beide

does string contains string - YES

Was definitiv NICHT das ist, was du willst.

Also die bessere Lösung, die meiner Meinung nach funktioniert, ist die Tatsache zu nutzen, dass rangeOfString die Länge von 0 zurückgibt. Also ist ein besserer, zuverlässigerer Code folgender:

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

ODER EINFACH:

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

was in den Fällen 1 und 2 zurückgibt

does string contains string - NO

Das ist mein Beitrag ;-)

Bitte schaue dir mein Gist für weiteren hilfreichen Code an.

12voto

vikingosegundo Punkte 51531

Eine verbesserte Version von P i's Lösung, einer Kategorie auf NSString, die nicht nur sagt, ob ein String in einem anderen gefunden wird, sondern auch einen Bereich per Referenz angibt, ist:

@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

Verwenden Sie es wie folgt:

NSString *string = @"Hallo, Welt!";

//Wenn Sie nur sicherstellen möchten, dass ein String einen bestimmten Teilstring enthält
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"JA");
}

// Oder einfach
if ([string containsString:@"ello"]) {
    NSLog(@"JA");
}

//Wenn Sie auch den Bereich des Teilstrings wissen möchten
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}

7voto

jerik Punkte 5544

Oneliner (Kleinere Menge an Code. DRY, da Sie nur ein NSLog haben):

NSString *string = @"hallo bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"nicht gefunden" : @"enthält bla");

7voto

Durai Amuthan.H Punkte 30175

Hier ist ein Kopier- und Einfüge-Funktionscodeausschnitt:

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

5voto

Pooja Patel Punkte 626

Probier das aus,

NSString *string = @"Test Daten";
if ([[string lowercaseString] rangeOfString:@"daten"].location == NSNotFound) 
{
    NSLog(@"String enthält keine Daten");
}   
else 
{
    NSLog(@"String enthält Daten!");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X