Замена с учетом регистра - PullRequest
0 голосов
/ 07 января 2019

У меня есть строка, которая может включать слово "favorite" (в американском английском) или заглавную "Favorite". Я хочу заменить их на английское правописание "favourite" или "Favourite" соответственно без изменения заглавных букв.

Я застрял с

element.gsub!(/Favorite/i, 'Favourite')

, которая всегда будет заглавной буквой первой буквы. Я не хочу сделать это слишком сложным или просто повторить замену для двух случаев. Какое лучшее решение?

Ответы [ 2 ]

0 голосов
/ 07 января 2019
subs = {
  'center'   =>'centre',    'defense'   =>'defense',
  'behavour' =>'behaviour', 'apologize' =>'apologise',
  'maneuver' =>'manoeuvre', 'pediatric' =>'paediatric',
  'traveled' =>'travelled', 'honor'     =>'honour',
  'favorite' =>'favourite', 'esthetics'  =>'aesthetics'
}

str = "My Favorite uncle, Max, an honorable gent, is \
       often the Center of attention at parties, mainly \
       because he has a great sense for Esthetics. \
       I apologize for my clumsy maneuver.".squeeze(' ') 

str.gsub(/\b\p{Alpha}+\b/) do |word|
  key = word.downcase
  if subs.key?(key)
    new_word = subs[key]
    new_word.capitalize! if word.match?(/\A\p{Upper}/)
    word = new_word
  end
  word
end
  #=> "My Favourite uncle, Max, an honorable gent, is \ 
  #    often the Centre of attention at parties, mainly \
  #    because he has a great sense for Aesthetics. \
  #    I apologise for my clumsy manoeuvre."

"honorable" не изменяется, поскольку он не является ключом в хэше subs (даже если он содержит ключ "honor"). Более полный пример может включать это слово в качестве ключа.

0 голосов
/ 07 января 2019

Вы можете захватить первую букву, а затем использовать обратную ссылку \1 для вставки захваченной обратной:

element.gsub!(/(f)avorite/i, '\1avourite')
               ^^^            ^^

См. это Ruby демо .

Группа захвата (f) вместе с модификатором i без учета регистра будут соответствовать f или F, а \1 в шаблоне замены вставит эту букву обратно.

Обратите внимание, что для замены целых слов вы должны использовать границы слов :

element.gsub!(/\b(f)avorite\b/i, '\1avourite')
               ^^          ^^

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...