ruby 多个正则表达式 gsub array.inject

ruby multiple regexp gsub with array.inject

我必须处理很长的文本,并在其中用正则表达式进行一些替换。 现在我写了下面的代码:

text = File.read(file)
replacements = [
                [/```([\w]+)/, "\n>"],
                [/```\n/, "\n\n"],
                [/pattern not found/, 'sub'],
                [/pattern that should be found/, 'no sub'],
               ]
replacements.inject(text) do |text, (k,v)|
    if text =~ k
        text.gsub!(k,v)
    end
end
File.write(name', text)

如果在我的文档中找到每个正则表达式,一切正常,但如果未找到替换模式,不会执行所有后续替换

我输入了 if text =~ k 但效果不一样。

有什么想法吗?

inject 的块必须 return memo 值。因此,您可能需要更改代码才能执行此操作:

replacements.inject(text) do |text, (k,v)|
    text.gsub(k,v)
end

if test =~ k 在您的案例中失败时,块的输出是 nil - 因此,问题。


或者,您可以使用 with_object

replacements.each.with_object(text) do |(k,v), text|
    text.gsub!(k,v)
end

每次注入迭代都应该return memo(在你的情况下text)到下一次迭代。试试这个代码:

replacements.inject(text) do |text, (k,v)|
  if text =~ k
    text.gsub!(k,v)
  end
  text
end

原因是 String#gsub! returns nil 如果没有进行替换,如果有则结果。另一个问题是你调用匹配两次,text =~ k 的检查是多余的。

我会选择 not inplace 版本的 gsub:

result = replacements.inject(text) do |text, (k, v)|
  text.gsub(k, v)
end

以上应该可以解决问题。

无论您是否仍想使用就地替换,您可能只是 return text 本身不成功 gsub!:

result = replacements.inject(text) do |text, (k, v)|
  text.gsub!(k, v) || text
end