Подтвердить что ты не робот

Заменить несколько символов в строке в Objective-C?

В PHP я могу это сделать:

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

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

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

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

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

Спасибо,
матовая

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

а не

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

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

Ответ 3

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

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

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

Ответ 4

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

(предполагается, что someText является атрибутом NSString или text)

NSString* someText = @"1232342jfahadfskdasfkjvas12!";

(в этом примере будут разбиты строки из строки)

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

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

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

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

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

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

Ответ 5

+ (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;
}

Ответ 6

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

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)

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

Ответ 7

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

Используйте replaceOccurrences вместе с опцией 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

Ответ 8

Создайте расширение на String...

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:"")