#objective-c #string #nsstring #replace #character-replacement
#objective-c #строка #nsstring #заменить #замена символа
Вопрос:
Хорошо, давайте предположим, что у меня есть эта строка:
R RATS ARE FAR
Я хочу заменить независимый R на X, чтобы:
X RATS ARE FAR
Я пробовал stringByReplacingOccurrencesOfString, но это заменяет все R на X. Один из способов выполнить это — проверить, есть ли пробел до и после буквы, что означало бы ее независимость, а затем перейти к уничтожению, но этот подход кажется таким неубедительным. Кроме того, строка является динамической, как и позиция R .
Ответ №1:
Я предполагаю здесь, что слова могут быть окружены практически любым не буквенно-цифровым символом, верно? (В противном случае вы бы просто заменили @» R» на » X», плюс особые случаи для начальных / завершающих вхождений)
Одним из способов сделать это было бы использовать RegexKitLite ‘s
[string replaceOccurrencesOfRegex:@"bRb" withString:@"X"];
( b
обозначает слово *b * oundaries в регулярных выражениях в стиле PCRE)
И тогда есть CFStringTokenizer (поиск в связанной документации для kCFStringTokenizerUnitWordBoundary
), который мог бы помочь, в качестве альтернативы.
Комментарии:
1. RegexKitLite сработал потрясающе. Кто-нибудь еще пытается сделать то же самое, все, что вам нужно сделать, это добавить «Два файла, RegexKitLite.h и RegexKitLite.m, и связать с разделяемой библиотекой ICU /usr /lib / libicucore.dylib». Плюс строка, подлежащая замене, должна быть NSMutableString, и мне пришлось использовать \ b вместо b в приведенном выше примере. И это помогло мне. Спасибо, Regexident.
Ответ №2:
Я бы сделал это таким образом:
NSString *statement = @"R RATS ARE FAR";
statement = [statement stringByReplacingOccurrencesOfString:@" R " withString:@" X "];
// now check if the string starts with R space
if ([statement hasPrefix:@"R "])
statement = [statement stringByReplacingOccurrencesOfString:@"R " withString:@"X " options:0 range:NSMakeRange(0,2)];
// now check the end
if ([statement hasSuffix:@" R"])
statement = [statement stringByReplacingOccurrencesOfString:@" R" withString:@" X" options:0 range:NSMakeRange([statement length] - 2, 2)];
И если вы планируете много замен в этой строке, вам следует использовать NSMutableString
.
Комментарии:
1. На самом деле это тоже в значительной степени то, что я описал. Однако у него есть один большой недостаток: это работает, только если последовательность слов строго разделена пробелом. Последовательность слов. Как только вы вводите не буквенно-цифровые символы, не содержащие пробелов, ваш метод прерывается, например: «FOO — ЭТО R, BAR — НЕТ».
2. @Regexident, в исходном вопросе ничего не упоминается о символе, отличном от альфа.
3. Справедливое замечание. Языковое сходство с образцом строки OP заставило меня предположить, что могут быть задействованы другие буквы, даже если они не указаны конкретно. В любом случае, я бы все же предпочел использовать абстракцию (здесь: regex) проблемы, вместо того, чтобы самостоятельно кодировать все возможные крайние случаи. Абстракция более защищена от незначительных изменений формата, следовательно, имеет более длительный срок службы, чем одноцелевые одноразовые реализации. Вы согласны? Мне любопытно.
4. Все комментарии в сторону, нет сомнений, что вы тоже предоставили правильное решение вопроса OP . 🙂
5. Я согласен, что использование регулярных выражений является лучшим решением. Но если исходный вопрос касается полной области видимости, то мне нравится мое решение, если мне не нужно добавлять другую библиотеку в мой проект.