Изменение текста на основе последней буквы имени пользователя с помощью регулярного выражения - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу изменить окончание имени пользователя в зависимости от варианта использования (в языковой системе будут работать имена, заканчивающиеся в зависимости от того, как оно используется).

Поэтому необходимо определить все окончания имен и определить их замену.Было предложено использовать регулярное выражение .gsub для поиска и замены в строке:

Изменение текста на основе последней буквы имени пользователя

"name surname".gsub(/e\b/, 'ai')

это заменитe с ai, так что "имя фамилия = намаи сурнамай".

Как это можно использовать для других опций, таких как: "e = ai, us = mi, i = as" на той же записи?

спасибо

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

@ Sundeep делает важное замечание в комментарии к вопросу.Например, если замены были даны следующим хешем:

g = {'e'=>'ai', 's'=>'es', 'us'=>'mi', 'i' => 'as'}
  #=> {"e"=>"ai", "s"=>"es", "us"=>"mi", "i"=>"as"}

'surnamus' будет преобразовано (неправильно) в 'surnamues' только потому, что 's'=>'es' предшествует 'us'=>'mi' в g.Такая ситуация может не существовать в настоящее время, но может быть целесообразно учесть это в будущем, особенно потому, что это так просто сделать:

h = g.sort_by { |k,_| -k.size }.to_h
  #=> {"us"=>"mi", "e"=>"ai", "s"=>"es", "i"=>"as"}

arr = ['surname', 'surnamus', 'surnami', 'surnamo']

Замены могут быть выполнены с использованием формы String @ # sub , который использует хэш в качестве второго аргумента.

r = /#{Regexp.union(h.keys)}\z/
  #=> /(?-mix:us|e|s|i)\z/i
arr.map { |s| s.sub(r,h) }
  #=> ["surnamai", "surnammi", "surnamas", "surnamo"]

См. Также Regexp :: union .

Кстати, хотя key-Начиная с Ruby v1.9, порядок вставки был гарантирован для хэшей, продолжаются споры о том, следует ли использовать это свойство в коде Ruby, главным образом потому, что не было понятия порядка ключей, когда хэши впервые использовались в компьютерных программах.Этот ответ является хорошим примером использования порядка ключей.

0 голосов
/ 05 декабря 2018

Вы можете использовать String#gsub с блоком. Документы говорят:

В блочной форме текущая строка совпадения передается в качестве параметра и переменных, таких как $ 1, $ 2, $ `, $ & и $будет установлен соответствующим образом.Значение, возвращаемое блоком, будет заменено на совпадение при каждом вызове.

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

Полный пример:

replacements = {'e'=>'ai', 'us'=>'mi', 'i' => 'as'}
['surname', 'surnamus', 'surnami'].map do |s| 
  s.gsub(/(e|us|i)$/){|p| replacements[p] }
end
...