【问题标题】:Random gsub string n-times随机 gsub 字符串 n 次
【发布时间】:2012-04-07 10:20:41
【问题描述】:

如何在 Ruby 中随机替换子字符串,恰好是 n 次?

例如,我有一个文字:

foo foo foo foo bar bar foo bar foo bar

我想在上面字符串的任何部分用 boo 替换两个随机的 foos

这些是可能的结果:

  1. foo foo boo foo bar bar foo bar boo bar
  2. boo foo foo foo bar bar boo bar foo bar
  3. foo boo foo boo bar bar foo bar foo bar
  4. 等等..

【问题讨论】:

    标签: ruby gsub


    【解决方案1】:
    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 }
    

    【讨论】:

      【解决方案2】:

      您可以找到所有要替换为string.index("substring") 的子字符串。您将获得子字符串第一个字符的索引。

      然后你可以使用这个索引之后的子字符串来查找你要替换的字符串的下一次出现,依此类推。

      存储要替换的子字符串开始的所有索引,并使用随机数来定义应替换的索引。

      【讨论】:

        【解决方案3】:

        最短的是:

        str.gsub(/foo/){|v| rand(2) == 0 ? 'boo' : v}
        

        【讨论】:

        • 这可能会替换一半的 'foo's 而不是 2 'foo's
        猜你喜欢
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2017-05-20
        相关资源
        最近更新 更多