Wie bekomme ich einen Teilstring von NSString?

78

@"value:hello World:value"Was soll ich verwenden, wenn ich einen Wert vom NSString erhalten möchte?

Der von mir gewünschte Rückgabewert ist @"hello World".

Csabi
quelle
Ich stimme dafür, diese Frage als unklar zu schließen, was Sie fragen. Es gibt überhaupt keinen Hinweis darauf, was genau hier gewünscht wird. Möchten Sie einfach zurückkehren "hello World"? return @"hello World". Möchten Sie nur das zurückgeben, was sich zwischen den Doppelpunkten befindet? Möchten Sie alles links vom Doppelpunkt ganz links und alles rechts vom Doppelpunkt ganz rechts entfernen? Es gibt keine klar definierten Eingabe-Ausgabe-Kriterien für diese Frage (wie wir aus der resultierenden Liste von Fragen sehen, die alle das Problem mit einer Vielzahl von Ansätzen lösen).
nhgrif

Antworten:

158

Option 1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"

Option 2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];

Dieser könnte für Ihren eher trivialen Fall etwas übertrieben sein.

Option 3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1];

Dieser erstellt beim Teilen drei temporäre Zeichenfolgen und ein Array.


Alle Snippets setzen voraus, dass das Gesuchte tatsächlich in der Zeichenfolge enthalten ist.

Regexident
quelle
Es hat auf NSAnchoredSearch geweint ... vielleicht ist NSMatchingAnchored besser.
Jonny
74

Hier ist eine etwas weniger komplizierte Antwort:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

Siehe auch substringWithRange und substringFromIndex

Shaun Neal
quelle
1
Dies beantwortet leider nicht die Frage (wie man einen Teilstring aus der Mitte eines Strings erhält).
Monolo
Was bringt das zurück
Chicowitz
16

Hier ist eine einfache Funktion, mit der Sie das tun können, wonach Sie suchen:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}

Verwendung:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];
Garett
quelle
1
Falls es leuchtet, kann ich Ihnen meinen Grund für die Abstimmung über die andere Antwort nennen. Ich würde lieber zwei Codezeilen als sechs schreiben.
Le Mot Juiced
2
Das Problem ist, dass diese beiden Codezeilen nur einen bestimmten Fall lösen, der für niemanden existieren wird - wahrscheinlich nicht einmal für die Person, die ihn gefragt hat.
Garett
getSubstring:…sollte aufgerufen werden, substringInString:…da Sie keinen Teilstring an ihn übergeben und Methoden, die mit beginnen, get…normalerweise einen Pufferzeiger zum Schreiben übergeben werden. substringFromIndex:erstellt eine Zwischenzeichenfolge, die unnötig ist, dafür rangeOfString:options:range:ist. Zuletzt, indem Sie das unsichere Snippet in eine vermeintlich generische Methode einschließen, maskieren Sie einen Fehler: Wenn das Trennzeichen ein oder mehrere Male in der Zeichenfolge vorhanden ist, wird eine Ausnahme außerhalb des Bereichs angezeigt.
Regexident
14

Verwenden Sie dies auch

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];

Hinweis - Ihr NSMakeRange(start, end)sollte sein NSMakeRange(start, end- start);

Abhishek Mishra
quelle
12

Hier ist eine kleine Kombination aus Antworten von @Regexident Option 1 und @Garett, um einen leistungsstarken String-Cutter zwischen einem Präfix und einem Suffix mit MEHR ... UND MEHR Wörtern zu erhalten.

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);
Jeffrey Neo
quelle
Das funktioniert jetzt! Ich habe Regixident's Option 1 ausprobiert, es hat bei mir nicht funktioniert. Ich kann mir nicht vorstellen warum. Ich habe nach einer Lösung gesucht, um eine Zeichenfolge in einem <i></i>Tag in meinem Projekt zu erhalten und diese Zeichenfolgen kursiv zu machen. :)
Glenn Posadas