Ruby中的数组替换
我正在尝试用Ruby进行多重替换。我会用PHP做:Ruby中的数组替换,ruby,replace,Ruby,Replace,我正在尝试用Ruby进行多重替换。我会用PHP做: $text = "bar foo baz doom?"; $before = ["bar", "foo", "baz"]; $after = ["goto", "if", "else"]; $result = preg_replace($before, $after, $text); // output: goto if else doom? 在Ruby中,下面这样的内容给了我一个错误: text = "bar foo baz doom?"
$text = "bar foo baz doom?";
$before = ["bar", "foo", "baz"];
$after = ["goto", "if", "else"];
$result = preg_replace($before, $after, $text);
// output: goto if else doom?
在Ruby中,下面这样的内容给了我一个错误:
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
result = text.gsub(before, after)
# => Can't convert Array into Regexp
你能帮我吗?我认为ruby中没有相应的方法。您可以
zip
在之前和之后,分别应用每个替换。下面是一个示例,我使用了dup
来防止原始内容发生变异
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
result = text.dup
before.each_index { |i| result.gsub!(before[i] ,after[i]) }
result
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
result = text.dup
before.zip(after).each { |pattern, replace| result.gsub!(pattern, replace) }
result
我认为ruby中没有相应的方法。您可以zip
在之前和之后,分别应用每个替换。下面是一个示例,我使用了dup
来防止原始内容发生变异
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
result = text.dup
before.zip(after).each { |pattern, replace| result.gsub!(pattern, replace) }
result
将Hash
与#gsub
一起使用:-
text = "bar foo baz doom?"
before = ["bar", "foo", "baz"]
after = ["goto", "if", "else"]
hash = Hash[before.zip(after)]
#=> {"bar"=>"goto", "foo"=>"if", "baz"=>"else"}
text.gsub(/\w+/) { |m| hash[m] || m }
#=> "goto if else doom?"
将Hash
与#gsub
一起使用:-
text = "bar foo baz doom?"
before = ["bar", "foo", "baz"]
after = ["goto", "if", "else"]
hash = Hash[before.zip(after)]
#=> {"bar"=>"goto", "foo"=>"if", "baz"=>"else"}
text.gsub(/\w+/) { |m| hash[m] || m }
#=> "goto if else doom?"
另一种归档方法
output = text.split.map { |x| before.index(x) ? after[before.index(x)] : x }.join(' ')
输出
包含请求的“如果否则就会失败,是否继续?”
。另一种存档方法
output = text.split.map { |x| before.index(x) ? after[before.index(x)] : x }.join(' ')
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
before.each_with_index do |reg, i|
text.gsub!(reg, after[i])
end
输出
根据请求包含“如果有其他厄运就去吗?”
。您可以通过使用ruby 1.9.2及更高版本中的正则表达式来实现这一点
text = "bar foo baz doom?"
before = [/bar/, /foo/, /baz/]
after = ['goto', 'if', 'else']
before.each_with_index do |reg, i|
text.gsub!(reg, after[i])
end
class String
def preg_replace(before, after)
gsub Regexp.union(before), Hash[before.zip(after)]
end
end
text = "bar foo baz doom?"
before = ["bar", "foo", "baz"]
after = ["goto", "if", "else"]
text.preg_replace before, after
#=> "goto if else doom?"
您可以通过在ruby 1.9.2及更高版本中使用regex来实现这一点
class String
def preg_replace(before, after)
gsub Regexp.union(before), Hash[before.zip(after)]
end
end
text = "bar foo baz doom?"
before = ["bar", "foo", "baz"]
after = ["goto", "if", "else"]
text.preg_replace before, after
#=> "goto if else doom?"
赋值是通过引用完成的,所以您正在更改原始字符串。赋值是通过引用完成的,所以您正在更改原始字符串。为什么要放置代码>在最后?顺便说一下,撬动输出看起来不太好。@sawa我正在吃晚饭。。我将编辑..一旦完成..:(奥雅纳,不用把你的食物拴起来,我帮你清理干净了。读者:注意|m
,而不是散列.key?(m)?散列[m]:m
。很好。@CarySwoveland谢谢你Cary。我的两只手被挡住了,所以无法编辑。你知道我的情况。:-)我猜“被阻挡”是指你手上有食物。考虑使用叉子。为什么要放<代码>;<代码>在最后?顺便说一下,撬动输出看起来不太好。@sawa我正在吃晚饭。。我将编辑..一旦完成..:(奥雅纳,不用把你的食物拴起来,我帮你清理干净了。读者:注意|m
,而不是散列.key?(m)?散列[m]:m
。很好。@CarySwoveland谢谢你Cary。我的两只手被挡住了,所以无法编辑。你知道我的情况。:-)我猜“被阻挡”是指你手上有食物。考虑使用叉子。托尼,在考虑选择一个答案之前,先考虑一下。急什么?快速做出选择可能会阻止其他可能更好的答案被提交,在我看来,这是对那些仍在研究答案的人的不尊重。另外,通过等待,你可以看到其他人对答案的看法。读者不止一次显示所选答案不正确或效率低下。一些成员在选择一个答案之前等待一天或更长时间。托尼,在选择答案之前,考虑暂停一会儿。急什么?快速做出选择可能会阻止其他可能更好的答案被提交,在我看来,这是对那些仍在研究答案的人的不尊重。另外,通过等待,你可以看到其他人对答案的看法。读者不止一次显示所选答案不正确或效率低下。一些成员等待一天或更长时间后才选择答案。