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 - 用另一个字符串替换第一次出现的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

用另一个字符串替换第一次和最后一次出现的字符串

SQL Regex - 用另一个字段的子字符串替换

用另一个字符替换字符串中的某些字符

Ruby 匹配第一次出现的字符串以进行 gsub 替换

Hive 查询仅替换第一次出现的子字符串

用另一个子字符串 C++ 替换子字符串