如何在 Ruby 中随机替换子字符串 n 次?
例如,我有一个文本:
foo foo foo foo 酒吧 foo 酒吧 foo 酒吧
我想在上面字符串的任何部分用boo替换两个随机foo 。
这些是可能的结果:
- foo foo boo foo bar bar foo bar boo bar
- 嘘 foo foo foo 酒吧 嘘 酒吧 foo 酒吧
- foo boo foo boo bar bar foo bar foo bar
- ETC..
str = "foo foo foo foo bar bar foo bar foo bar"
num = 2
# get an array of all foo's; replace 2 foos with boo; shuffle the array.
ar = (["boo"]*num + str.scan(/foo/)[num..-1]).shuffle
# replace each foo with the next element of the array.
str.gsub(/foo/){ ar.pop }
最短的是:
str.gsub(/foo/){|v| rand(2) == 0 ? 'boo' : v}
您可以找到要替换为的子字符串的所有匹配项string.index("substring")
。您将获得子字符串第一个字符的索引。
然后您可以使用此索引之后的子字符串来查找要替换的字符串的下一个匹配项,依此类推。
存储要替换的子字符串开始的所有索引,并使用随机数来定义应替换的索引。