【问题标题】:Ruby - replace the first occurrence of a substring with another stringRuby - 用另一个字符串替换第一次出现的子字符串
【发布时间】:2011-12-19 06:55:17
【问题描述】:

a = "foobarfoobarhmm"

我希望输出为 `"fooBARfoobarhmm"

即只有第一次出现的“bar”应该替换为“BAR”。

【问题讨论】:

    标签: ruby string replace


    【解决方案1】:

    使用#sub:

    a.sub('bar', "BAR")
    

    【讨论】:

      【解决方案2】:

      String#sub 是你所需要的,正如 Yossi 已经说过的那样。但我会改用正则表达式,因为它更快:

      a = 'foobarfoobarhmm'
      output = a.sub(/foo/, 'BAR')
      

      【讨论】:

      • 我刚刚做了一个基准测试,正则表达式比仅使用字符串作为 sub 的参数要长 50%。
      • 我查了一下,Regexp版本更快。我使用了 MRI 1.9.2、1.9.3、2.0.0 甚至 JRuby,它们在 Regexp 版本上都更快。基准代码:gist.github.com/tbuehlmann/5574713 想提供您的基准吗?
      • 这不是很直观。我希望正则表达式比专用方法慢。
      • 在我看来(IMO),当您不需要正则表达式时,字符串版本更具可读性。
      • @NielsB。 RegEx 引擎的优化级别差异很大。字符串解析的效率范围很广,从可怕到令人印象深刻。正则表达式可以在两端。
      【解决方案3】:

      要替换第一个匹配项,只需这样做:

      str = "Hello World"
      str['Hello'] = 'Goodbye'
      # the result is 'Goodbye World'
      

      你甚至可以使用正则表达式:

      str = "I have 20 dollars"
      str[/\d+/] = 500.to_s
      # will give 'I have 500 dollars'
      

      【讨论】:

      • 500.to_s 有时写作"500"。 :-)
      • 我是故意这样写的。表示您需要分配一个显式字符串。因为这里的转换不是自动的。如果你这样做而不是str[/\d+/] = 500,你会得到一个错误TypeError: no implicit conversion of Fixnum into String。
      猜你喜欢
      • 2022-01-13
      • 2016-12-19
      • 2014-03-21
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2011-08-25
      相关资源
      最近更新 更多