2009-04-03 6 views
45

In PHP kann ich dies tun:Ersetzen Sie mehrere Zeichen in einer Zeichenfolge in Objective-C?

$new = str_replace(array('/', ':', '.'), '', $new); 

... alle Instanzen der Zeichen zu ersetzen /:. mit einer leeren Zeichenfolge (um sie zu entfernen)

Kann ich dies leicht in Objective-C tun? Oder muss ich meine eigenen rollen?

Derzeit mache ich mehrere Anrufe zu stringByReplacingOccurrencesOfString:

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""]; 
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]; 
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""]; 

Danke,
matt

Antwort

118

Eine etwas ineffizienter Weg, dies zu tun:

NSString *s = @"foo/bar:baz.foo"; 
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."]; 
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
NSLog(@"%@", s); // => foobarbazfoo 

Blick auf NSScanner und -[NSString rangeOfCharacterFromSet: ...] wenn Sie möchten das ein bisschen effizienter machen.

+0

Danke für die Antwort, tut –

+0

dank arbeiten wie reizend –

27

Es gibt Situationen, in denen Sie Ihre Methode gut genug ist, ich denke, matt .. BTW, ich denke es ist besser

[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]]; 

zu verwenden, anstatt

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""]; 

wie ich glaube, du bist ein Überschreiben NSMutableString-Zeiger mit einem NSString, der einen Speicherverlust verursachen kann.

+0

Dank Nick - immer gut über die kleinen Details zu hören –

+0

NSString nicht zu setString reagieren. – fuzz

+0

Aber NSMutableString macht richtig? –

2
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str 
{ 
    NSMutableString* string = [[NSMutableString alloc] initWithString:str]; // #&39; replace with ' 
    NSString* unicodeStr = nil; 
    NSString* replaceStr = nil; 
    int counter = -1; 

    for(int i = 0; i < [string length]; ++i) 
    { 
     unichar char1 = [string characterAtIndex:i]; 
     for (int k = i + 1; k < [string length] - 1; ++k) 
     { 
      unichar char2 = [string characterAtIndex:k]; 

      if (char1 == '&' && char2 == '#') 
      { 
       ++counter; 
       unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39 
       replaceStr = [string substringWithRange:NSMakeRange (i, 5)]; // #&39; 
       [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]]; 
       break; 
      } 
     } 
    } 

    [string autorelease]; 

    if (counter > 1) 
     return [self decodeHtmlUnicodeCharactersToString:string]; 
    else 
     return string; 
} 
+0

Bitte formatieren Ihr Kommentar mit Code-Tags –

1

Wenn die Zeichen, die Sie wünschen einander benachbart sein, entfernen waren, konnten Sie verwenden

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *) 

Other than that, ich denke, mit nur die gleiche Funktion mehrmals ist nicht so schlimm . Es ist viel besser lesbar, als eine große Methode zu erstellen, um dasselbe auf eine allgemeinere Weise zu tun.

5

Im Wesentlichen das Gleiche wie Nicholas oben, aber wenn Sie alles außer einer Reihe von Zeichen entfernen wollen (sagen Sie, dass Sie alles entfernen wollen, was nicht in der Menge "ABCabc123" ist), dann können Sie Folgendes tun:

NSString *s = @"A567B$%C^.123456abcdefg"; 
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet]; 
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
NSLog(@"%@", s); // => ABC123abc 

Nützlich in Strippen Symbole und so, wenn Sie nur alphanumerische wollen.

6

Wäre dies vor kurzem zu tun und wollte eine effiziente Methode teilen:

(unter der Annahme, sometext ist ein NSString oder Textattribut)

NSString* someText = @"1232342jfahadfskdasfkjvas12!"; 

(dieses Beispiel Zahlen aus einer Zeichenfolge Streifen)

Denken Sie daran, dass Sie regex literale Zeichen mit Obj-c Escape-Zeichen:

entkommen müssen 0

(obj-c verwendet einen doppelten Backslash spezielle Regex-Literale zu entkommen)

...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]" 

Was diese interessant macht, ist, dass NSRegularExpressionSearch Option wenig genutzt, aber einige sehr leistungsstarke Kontrollen führen kann:

Sie können finden Sie eine nette iOS Regex-Tutorial here und mehr auf regulären Ausdrücken bei regex101.com

+0

Sehr schöne Lösung. –

1

Hier ist ein Beispiel in Swift 3 mit der RegularExpression -Option ofOccurances ersetzen.

Verwenden replacingOccurrences zusammen mit einem der String.CompareOptions.regularExpression Option.

Beispiel (Swift 3):

var x = "<Hello, [play^ground+]>" 
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil) 
print(y) 

Ausgang:

7Hello, 7play7ground777 
1

eine Erweiterung auf String erstellen ...

extension String { 

    func replacingOccurrences(of strings:[String], with replacement:String) -> String { 
     var newString = self 
     for string in strings { 
      newString = newString.replacingOccurrences(of: string, with: replacement) 
     } 
     return newString 
    } 

} 

es so Aufruf:

aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"")