Замена предложения в Ruby с использованием String#gsub

А что, если я попытаюсь изменить только часть слова? Например, «Car» на «cah» или наоборот в «Martha» на «Marther». Во втором случае, если бы я только что сделал это следующим образом:

<if sentance.include? "er"
    user_input.gsub!(/er/, "a")
end > 

Потребуются все «а» в «MArthA», а это не то, чего я хочу.

Любые идеи? Для других примеров. Заменить слова в строке - ruby


person Sal Coraccio IV    schedule 24.09.2016    source источник
comment
Если str = "Where's Martha, Billy-Bob?", вам, вероятно, нужно что-то вроде str.gsub(/(?<=\bMarth)a\b/,"er") #=> "Where's Marther, Billy-Bob?". (?<=\bMarth) называется позитивным ретроспективным анализом. Это гарантирует, что заменяемому символу ("a") предшествует разрыв слова (\b), за которым следует строка "Marth", но это не является частью совпадения. Если бы я знал, что предложение содержит только одно "Martha", я мог бы использовать sub, а не gub. Ваше упоминание о cah напомнило мне о Загадке Ворона.   -  person Cary Swoveland    schedule 24.09.2016
comment
Вам нужно лучше определить свою грамматику, правила, по которым выполняются эти преобразования. Это только последний a?   -  person tadman    schedule 24.09.2016
comment
Эта шутка про ворону великолепна. В основном моя цель здесь состоит в том, чтобы построить преобразователь ввода текста из базовой речи в акцент Новой Англии. Итак, используя эти правила, меня действительно интересует только конец слова; особенно слова, оканчивающиеся на As или ERs - как обмен в просторечии. Знак $ может работать, но что означает конец строки? Ищет ли он в строке слова, оканчивающиеся на As? Или это только последнее слово в строке - или это a\z?   -  person Sal Coraccio IV    schedule 25.09.2016


Ответы (1)


Ваш пример и код показывают прямо противоположные результаты. Предполагая, что вы хотите заменить последнюю букву «а» Марты на «эр», это должно заменить «а» в конце строки:

user_input.gsub!(/a$/,'er')

и если строка "Где Марта, Билли-Боб?":

user.gsub!(/a\b/,'er')

\b - это окончание или начало слова

person Sid    schedule 24.09.2016
comment
Обратите внимание, что a$ — это конец строки, а не обязательно конец строки (это будет a\z). Вероятно, в данном случае это не имеет значения, но в других ситуациях (например, при проверке данных) это может быть дырой в безопасности, так что хорошо знать об этом. - person Henrik N; 24.09.2016