【问题标题】:Regex with Regex.union but case insensitive gsub find and replace带有 Regex.union 但不区分大小写的正则表达式 gsub 查找和替换
【发布时间】: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”)

标签: regex ruby


【解决方案1】:

要么将块传递给gsubdowncase 密钥:(假设所有哈希密钥都是小写的)

"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"

【讨论】:

  • "AAAword".gsub(regexp, dict_texts) 结果是 "bBbword" 和 "wordAAA".gsub(regexp, dict_texts) 结果是 "wordAAA",你知道为什么吗?
  • 两种情况下我都想要“wordAAA”
  • @echan00 您的示例正则表达式 /\b(?:aaa|ccc)\b/ix 由于单词边界 \b 而不会匹配其中任何一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2011-04-22
  • 2013-11-12
相关资源
最近更新 更多