Ruby - 用另一个字符串替换第一次出现的子字符串

70

a = "foobarfoobarhmm"

我想要输出结果为 `"fooBARfoobarhmm"`。

即只有第一个出现的 "bar" 要被替换为 "BAR"。

3个回答

135

使用 #sub

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

18

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

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

我刚刚进行了基准测试,正则表达式所需的时间比仅将字符串作为 sub 函数参数使用要长50%。 - Niels B.
嗯,我必须为我的断言道歉,看来我的基准测试中出现了错误。实际上,正则表达式更快。 - Niels B.
1
这不是很直观。我会期望一个正则表达式比一个专门的方法慢。 - Niels B.
11
在我看来(IMO),当你不需要使用正则表达式时,字符串版本更易读。 - ma11hew28
1
@NielsB. 正则表达式引擎在优化程度上有很大的差异。字符串解析的效率范围非常广泛,从糟糕到令人印象深刻都有可能。正则表达式可以处于两个极端之间。 - Brenden
显示剩余2条评论

11

只需执行以下操作即可替换第一个出现的内容:

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'

1
500.to_s 有时会被写成 "500"。 :-) - Cary Swoveland
1
我有意写成这样,来表明你需要分配一个显式字符串,因为此处转换不是自动的。如果你改用 str[/\d+/] = 500 ,你会得到一个错误 TypeError: no implicit conversion of Fixnum into String - Nafaa Boutefer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接