Regex с Regex.union, но gsub без учета регистра находит и заменяет - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь выполнить ввод и замену строки без учета регистра. У меня есть это:

string = "12 aaa aAa AAA aaaword ddd"
dict_texts = {"aaa" => "bBb", "ccc" => "dDd"}

Я хочу это:

"12 bBb b8b b8b aaaword ddd"

Я сделал это:

regexp = /\b(?:#{ Regexp.union(dict_texts.keys).source })\b/ix
#=> /\b(?:aaa|ccc)\b/ix
string.gsub(regexp, dict_texts)
#=> "12 bBb   aaaword ddd"

Я довольно близко. но все еще возникают проблемы.

1 Ответ

1 голос
/ 13 марта 2019

Либо передайте блок на gsub на downcase ключ: (учитывая, что все ключи хеша строчные)

"12 aaa aAa AAA aaaword ddd".gsub(regexp) { |s| dict_texts[s.downcase] }
#=> "12 bBb bBb bBb aaaword ddd"

Или используйте хеш с default_proc, который делает это для вас:

dict_texts.default_proc = ->(h, k) { h.fetch(k.downcase, nil) }

"12 aaa aAa AAA aaaword ddd".gsub(regexp, dict_texts)
#=> "12 bBb bBb bBb aaaword ddd"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...