Заменить несколько символов в строке в Objective-C? - PullRequest
47 голосов
/ 03 апреля 2009

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

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

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

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

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

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

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

Ответы [ 8 ]

121 голосов
/ 03 апреля 2009

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

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

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

27 голосов
/ 02 июня 2009

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

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

вместо

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

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

7 голосов
/ 07 сентября 2014

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

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

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

6 голосов
/ 22 января 2014

По сути то же самое, что и Николас, опубликованный выше, но если вы хотите удалить все, кроме набора символов (например, вы хотите удалить все, что не входит в набор «ABCabc123»), то вы можете сделать следующее: 1001 *

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

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

2 голосов
/ 01 апреля 2010
+ (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;
}
1 голос
/ 18 ноября 2016

Создать расширение для 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:"")
1 голос
/ 10 ноября 2016

Вот пример в Swift 3, использующий параметр normalExpression для замены Occurances.

Используйте replaceOccurrence вместе с параметром 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 голос
/ 19 января 2012

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

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...