Как добавить определенный символ в набор символов в строке NSString

Я хочу добавить определенный символ перед набором символов в строке NSString.

Например:

NSString *input = @"abc^ 123 # //> <";    
NSString *insertBefore = @"~";
NSCharacterSet *needBeInserted = [NSCharacterSet 
                        characterSetWithCharactersInString:@"~#^/<>"];

Ожидаемый результат: любые символы в needBeInserted что появляется в input добавлю insertBefore,

result = @"abc~^ 123 ~# ~/~/~> ~<";

Есть ли элегантный способ сделать это? Вместо использования нескольких строк stringByReplacingOccurrencesOfString?

2 ответа

Решение

Вы можете поместить свои символы в класс символов и использовать замену на основе регулярных выражений:

[~#^/<>]

Заменить ~$0 где $0 вставляет весь текст совпадения в результирующую строку. Смотрите демо-версию регулярного выражения.

Посмотрите демонстрацию Objective-C онлайн:

NSError *error = nil;
NSString *input = @"abc^ 123 # //> <";
NSString *pat = @"[~#^/<>]";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pat options:nil error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:input 
        options:0 
        range:NSMakeRange(0, [input length]) 
        withTemplate:@"~$0"];
NSLog(@"%@", modifiedString);

Результат: abc~^ 123 ~# ~/~/~> ~<

Вы должны найти символы и заменить их:

NSRange searchRange = NSMakeRange( 0,[input length] );
NSRange charRange;
while( (charRange = [input rangeOfCharactersFromSet:escapeSet options:NSBackwardSearch).length range:searchRange)
{
  // It is allowed to have a 0-length range: Insertion
  input = [input stringByReplacingCharactersInRange:NSMakeRange(charRange.location, 0) withString:@"\"];

  // Shorten the search range
  searchRange = NSMakeRange(0, charRange.location);
}

Написано в сафари. Вы должны проверить, если для крайних случаев и опечаток.

Другой способ - сделать массив (однобуквенных) строк из набора символов и заменить его вхождения комбинацией с escape-символом. Кажется, более сложным и менее естественным для меня.

Другие вопросы по тегам