Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中的数组替换_Ruby_Replace - Fatal编程技术网

Ruby中的数组替换

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

我正在尝试用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?"
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。我的两只手被挡住了,所以无法编辑。你知道我的情况。:-)我猜“被阻挡”是指你手上有食物。考虑使用叉子。托尼,在考虑选择一个答案之前,先考虑一下。急什么?快速做出选择可能会阻止其他可能更好的答案被提交,在我看来,这是对那些仍在研究答案的人的不尊重。另外,通过等待,你可以看到其他人对答案的看法。读者不止一次显示所选答案不正确或效率低下。一些成员在选择一个答案之前等待一天或更长时间。托尼,在选择答案之前,考虑暂停一会儿。急什么?快速做出选择可能会阻止其他可能更好的答案被提交,在我看来,这是对那些仍在研究答案的人的不尊重。另外,通过等待,你可以看到其他人对答案的看法。读者不止一次显示所选答案不正确或效率低下。一些成员等待一天或更长时间后才选择答案。