2009-04-03 14 views
45

W PHP mogę to zrobić:Zamień wiele znaków w ciągu znaków w Objective-C?

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

... zastąpić wszystkie wystąpienia znaków /. z pustym ciągiem (aby je usunąć)

Czy mogę to łatwo zrobić w Objective-C? A może muszę wykonać własne?

Obecnie robie kilka połączeń do stringByReplacingOccurrencesOfString:

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

Dzięki
matowy

Odpowiedz

118

Nieco nieefektywny sposób to zrobić:

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

Spójrz na NSScanner i -[NSString rangeOfCharacterFromSet: ...] jeżeli chcesz to zrobić nieco bardziej efektywnie.

+0

Dzięki za odpowiedź, zrobię –

+0

dzięki pracy jak uroczy –

27

Istnieją sytuacje, w których metoda jest wystarczająco dobry, myślę Matt .. BTW, myślę, że lepiej jest użyć

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

zamiast

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

jak myślę, że zastąpieniem NSMutableString wskaźnik z NSString, który może spowodować wyciek pamięci.

+0

Dzięki Nick - zawsze dobrze usłyszeć o małych szczegółach –

+0

NSString nie odpowie na setString. – fuzz

+0

Ale NSMutableString ma rację? –

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

Proszę formatować twój komentarz z tagami kodu –

1

Jeśli znaki chcesz usunąć miały być obok siebie można użyć

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *) 

Poza tym, myślę, że właśnie za pomocą tej samej funkcji kilkakrotnie nie jest tak źle . Jest o wiele bardziej czytelny niż stworzenie dużej metody, aby zrobić to samo w bardziej ogólny sposób.

5

Zasadniczo to samo, co Nicholas zamieszczony powyżej, ale jeśli chcesz usunąć wszystko Z WYJĄTKIEM zestawu znaków (powiedz, że chcesz usunąć wszystko, czego nie ma w zestawie "ABCabc123"), możesz wykonać następujące czynności:

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

Przydatny w usuwaniu symboli i takich, jeśli chcesz tylko alfanumeryczne.

6

Gdyby to zrobić niedawno i chciałem podzielić się skutecznej metody:

(zakładając Jakiś tekst jest NSString lub atrybut tekst)

NSString* someText = @"1232342jfahadfskdasfkjvas12!"; 

(w tym przykładzie będzie rozebrać liczb z ciągiem)

[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])]; 

Należy pamiętać, że trzeba będzie uciec od literalnych znaków regex za pomocą znaku ucieczki z postaci Obj-a:

(obj-c wykorzystuje podwójny backslash uciec specjalne literały regex)

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

Co sprawia, że ​​to ciekawe, opcja NSRegularExpressionSearch jest mało używany, ale może prowadzić do bardzo potężnych kontroli:

Ty możliwe, znajdź ładny samouczek regex dla iOS: i więcej na temat wyrażeń regularnych pod adresem regex101.com

+0

Bardzo ładne rozwiązanie. –

1

Oto przykład w Swift 3 przy użyciu opcji regularExpression zastępowaniaOccurances.

Zastosowanie replacingOccurrences wraz z opcją naString.CompareOptions.regularExpression.

Przykład (Swift 3):

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

wyjściowa:

7Hello, 7play7ground777 
1

Załóż rozszerzenia na ciąg ...

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 
    } 

} 

Nazwijmy to tak:

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