【发布时间】:2019-03-13 08:47:17
【问题描述】:
我正在尝试对字符串执行不区分大小写的基于单词的“查找和替换”。我有这个:
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"
我已经很接近了。但还是有一些问题。
【问题讨论】:
-
@WiktorStribiż我认为这是一个可能的解决方案,但它似乎不适用于 gsub,并且重写更多的哈希类似乎是个坏主意
-
见第二个答案。
"12 aaa aAa AAA aaaword ddd".gsub(regexp) { | x | dict_texts[x.downcase] }。这将起作用,因为您的键都是小写的。 -
顺便说一句,在
Regexp.new调用中包装正则表达式文字是多余的。这就像写String.new("foo")而不仅仅是"foo"。 -
我认为这很重要,不是吗?没有包装,“cloudaaa”变成“cloudaaa”,这很好(我不确定为什么它不适用于“aaacloud”->“bBbcloud”)