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