45 Stimmen

Objective-C: Beste Weg, um Teilstring aus NSString zu extrahieren?

Ich habe eine durch Leerzeichen getrennte Zeichenfolge wie @"abc xyz http://www.example.com aaa bbb ccc" .

Wie kann ich die Teilzeichenkette extrahieren @"http://www.example.com" von ihr?

2voto

mmackh Punkte 3510

Ich finde PHPs substr() wirklich bequem. Schau dir mein NSString-Kategorie wenn Sie so etwas machen wollen:

substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)

oder

substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)

In beiden Fällen erhalten Sie das Ergebnis von http://www.example.com

Hier ist eine Kopie des entsprechenden Teils des Codes:

__attribute__((overloadable))
NSString *substr(NSString *str, int start)
{
    return substr(str, start, 0);
}

__attribute__((overloadable))
NSString *substr(NSString *str, int start, int length)
{
    NSInteger str_len = str.length;
    if (!str_len) return @"";
    if (str_len < length) return str;
    if (start < 0 && length == 0)
    {
        return [str substringFromIndex:str_len+start];
    }
    if (start == 0 && length > 0)
    {
        return [str substringToIndex:length];
    }
    if (start < 0 && length > 0)
    {
        return [[str substringFromIndex:str_len+start] substringToIndex:length];
    }
    if (start > 0 && length > 0)
    {
        return [[str substringFromIndex:start] substringToIndex:length];
    }
    if (start > 0 && length == 0)
    {
        return [str substringFromIndex:start];
    }
    if (length < 0)
    {
        NSString *tmp_str;
        if (start < 0)
        {
            tmp_str = [str substringFromIndex:str_len+start];
        }
        else
        {
            tmp_str = [str substringFromIndex:start];
        }
        NSInteger tmp_str_len = tmp_str.length;
        if (tmp_str_len + length <= 0) return @"";
        return [tmp_str substringToIndex:tmp_str_len+length];
    }

    return str;
}

0voto

Jonathan Sterling Punkte 18133

Eine mögliche Lösung könnte die Verwendung regulärer Ausdrücke sein. Schauen Sie sich RegexKit .

2 Stimmen

Regexp ist fast immer die falsche Lösung. Insbesondere der Abgleich von URLs ist muy schwierig, da die richtige Regexp sehr lang ist. Zum Beispiel ist es schwierig, E-Mail-Adressen zu finden: reguläre-ausdrücke.info/email.html

0 Stimmen

"Manche Leute denken, wenn sie mit einem Problem konfrontiert werden, "Ich weiß, ich werde reguläre Ausdrücke verwenden." Jetzt haben sie zwei Probleme." regex.info/blog/2006-09-15/247

0voto

awhie29urh2 Punkte 14387

Wenn Ihre Eingabezeichenkette einfache Garantien hat (zum Beispiel die Garantie, dass Token in der Zeichenkette immer durch ein Leerzeichen abgegrenzt sind), dann teilen Sie das Leerzeichen auf und testen Sie jedes Element auf @"http://" als Präfix.

NSString *input = @"abc xyz http://www.example.com aaa bbb ccc";

NSArray *parts = [input componentsSeparatedByString:@" "];
for (NSString *part in parts) {
    if ([part hasPrefix:@"http://"]) {
        // Found it!
    }
}

Dies kann je nach den Anforderungen der Anwendung optimiert werden, z. B. indem die Schleife kurzgeschlossen wird, sobald das Element gefunden ist, oder indem Filter in BlocksKit verwendet werden, um nur Elemente zu erhalten, die mit dem Präfix beginnen. Die ideale Lösung hängt von der Art der Eingabezeichenfolge ab und davon, was Sie mit ihr erreichen wollen.

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