2013-05-28 2 views
3

Довольно простой вопрос:Есть ли эквивалент Objective-C (NSString) Java replaceAll ("\ p {Cntrl}", "")?

Есть ли Objective-C эквивалентно, что разработчики IOS можно использовать с объектами NSString, чтобы сделать то же самое, как replaceAll в Java («\ р {Cntrl}», «») слово в строку?

У нас уже есть это в Java:

String noControlCharsString = maybeHasControlCharsString.replaceAll("\\p{Cntrl}", ""); 

Я хочу что-то подобное в Objective-C тоже:

NSString *noControlCharsString = [maybeHasControlCharsString stringByReplacingControlCharsWithString:@""]; 

Спасибо заранее.

AG3

ответ

2

Попробуйте использовать этот .. Это используется для замены символов.

NSString *str = @"\\p{Cntrl}AB/bar:baz\\p{Cntrl}foo"; 
    NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"\\p{Cntrl}"]; 
    str = [[str componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
    NSLog(@"%@", str); 

Другой мудрый Это используется, чтобы заменить всю строку.

NSString *str = @"\\p{Cntrl} This is a string \\p{Cntrl}"; 

    str = [str stringByReplacingOccurrencesOfString:@"\\p{Cntrl}" 
              withString:@""]; 

     NSLog(@"%@", str); 
+1

Спасибо, но «\\ р {CNTRL}», используемые в Java является регулярным выражением, которое на самом деле специально соответствует всем символам управления, которые могут появиться в строка - не только фактические текстовые буквы, составляющие эту специальную последовательность. Я ищу решение, которое вырывает _all_ эти управляющие символы. –

+0

Что вы хотите заменить либо на один символ, либо на целую строку ?. –

1

Метод NSStringstringByReplacingOccurrencesOfString имеет NSRegularExpressionSearch вариант, который принимает один и тот же шаблон \ р {Cntrl} в качестве метода Java:

NSString *maybeHasControlCharsString = @"\nabc\r\ndef\r"; 
NSString *noControlCharsString = 
    [maybeHasControlCharsString stringByReplacingOccurrencesOfString:@"\\p{Cntrl}" 
             withString:@"" 
              options:NSRegularExpressionSearch 
              range:NSMakeRange(0, [maybeHasControlCharsString length])]; 
NSLog(@"%@", noControlCharsString); 
// Output: abcdef 
0

Try:

NSString *noControlCharsString = [maybeHasControlCharsString stringByTrimmingCharactersInSet:controlCharacterSet]; 

EDIT Как верно говорит Мартин R вышесказанное удаляет только ведущие или завершающие совпадения.

Вот метод категории, которая удаляет все матчи из строки:

- (NSString *)stringByStrippingCharactersInSet:(NSCharacterSet *)set { 
    NSString *r = [self stringByTrimmingCharactersInSet:set]; 
    NSArray *components = [r componentsSeparatedByCharactersInSet:set]; 
    components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]]; 
    return [components componentsJoinedByString:@""]; 
} 
+0

'stringByTrimmingCharactersInSet' удаляет только * ведущие * и * конечные * символы, поэтому' '\ nA \ nB \ n" 'станет' 'A \ nB" '. Средний управляющий символ не заменяется. –

+0

Спасибо Мартин. Да, мой первый вклад, и это было неправильно :( – ijwelch

+0

Добро пожаловать в SO! Ваш новый код выглядит правильно, вы даже можете удалить вызов 'stringByTrimmingCharactersInSet'. - (Я должен признать, что я не большой поклонник использования' componentsSeparatedByCharactersInSet' для фильтрации строки, поскольку она создает много временных объектов.) –

Смежные вопросы