2009-04-03 2 views
45

В PHP я могу это сделать:Заменить несколько символов в строке в Objective-C?

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

... заменить все экземпляры символов /:. с пустой струной (для их удаления)

Могу ли я сделать это легко в Objective-C? Или мне нужно сворачивать?

В настоящее время я делаю несколько вызовов stringByReplacingOccurrencesOfString:

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

Спасибо,
матовый

ответ

118

Несколько неэффективный способ сделать это:

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

Посмотрите на NSScanner и -[NSString rangeOfCharacterFromSet: ...] если вы хотите сделать это немного более эффективно.

+0

Спасибо за ответ, сделаю –

+0

благодаря работе как очаровательный –

27

Есть ситуации, когда ваш метод является достаточно хорошим, я думаю, матовая .. Кстати, я думаю, что лучше использовать

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

вместо

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

, как я думаю, что вы перезапись Указатель NSMutableString с NSString, который может вызвать утечку памяти.

+0

Спасибо Nick - всегда приятно слышать о мелких деталях –

+0

NSString не будет отвечать на setString. – fuzz

+0

Но NSMutableString делает правильно? –

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

Пожалуйста, отформатируйте ваш комментарий с кодовыми тегами –

1

Если символы, которые вы хотите удалить должны были быть рядом друг с другом можно использовать

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *) 

Кроме того, я думаю, просто используя одну и ту же функцию несколько раз не так уж плохо , Это гораздо читательнее, чем создание большого метода для того, чтобы сделать то же самое более общим образом.

5

По существу то же, что и Николас, размещенное выше, но если вы хотите удалить все, ЗА ИСКЛЮЧЕНИЕМ набора символов (скажем, вы хотите удалить все, что не находится в наборе «ABCabc123»), вы можете сделать следующее:

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

Полезно для удаления символов и т.п., если вы хотите только буквенно-цифровой.

6

бы сделать это в последнее время и хотел бы поделиться эффективный метод:

(при условии, SOMETEXT является NSString или текстовый атрибут)

NSString* someText = @"1232342jfahadfskdasfkjvas12!"; 

(этот пример будет раздеться числа из строки)

Имейте в виду, что вам нужно будет избежать символа регулярного выражения с использованием символа escape-функции Obj-c:

(Obj-C использует двойную обратную косую черту, чтобы избежать специальных регулярных выражений литералов)

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

Что делает это интересным является то, что вариант NSRegularExpressionSearch используется мало, но может привести к очень мощные элементы управления:

Вы можете найти хорошее руководство по регулярному выражению iOS here и более по регулярным выражениям по адресу regex101.com

+0

Очень приятное решение. –

1

Вот пример в Swift 3 с использованием опции регулярного выражения для заменыСохранения.

Использование replacingOccurrences вместе с в String.CompareOptions.regularExpression вариант.

Пример (Swift 3):

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

Выход:

7Hello, 7play7ground777 
1

Создать расширение на строки ...

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 
    } 

} 

Назовите это так:

aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"") 
Смежные вопросы