Ruby - 用另一个字符串替换第一次出现的子字符串
Posted
技术标签:
【中文标题】Ruby - 用另一个字符串替换第一次出现的子字符串【英文标题】:Ruby - replace the first occurrence of a substring with another string 【发布时间】:2011-12-19 06:55:17 【问题描述】:a = "foobarfoobarhmm"
我希望输出为 `"fooBARfoobarhmm"
即只有第一次出现的“bar”应该替换为“BAR”。
【问题讨论】:
【参考方案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
。以上是关于Ruby - 用另一个字符串替换第一次出现的子字符串的主要内容,如果未能解决你的问题,请参考以下文章