在Ruby中的第一个=符号后获取子字符串

时间:2012-12-28 18:04:00

标签: ruby string

纯粹出于好奇,是否有更优雅的方法来简单地获取字符串中第一个=符号后面的子字符串?以下作品回馈name=bob

string = "option=name=bob"
string[string.index('=')+1..-1]

它感觉不太Ruby。这也有效:

string.split('=', 2)[1]

同样,不是很优雅,特别是因为split正在做额外的不必要的工作。正则表达式是答案吗?我觉得这对于在字符串中查找单个字符位置的简单性来说有点过分:

string.match('=(.*)')[1]

我必须想象这是一种非常常见的情况,是不是有string.after('=')类型的方法? Ruby on Rails是否提供类似这样的事情,因为在网络上使用这种操作的频率是什么?

更新 :忘记在未找到符号时提及情况,应返回nil或空字符串。但是正则表达式机制和.index方法需要额外检查(因此不那么优雅)。

5 个答案:

答案 0 :(得分:68)

不完全是.after,但非常接近:

string.partition('=').last

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-partition

答案 1 :(得分:12)

还有这种方式:

string.partition('=')[2]

这一个:

string.sub(/.*?=/, '')

我认为我更喜欢你提到的正则表达方式。

答案 2 :(得分:1)

可能不是Ru​​by方式(它有点神秘),但你可以这样做:

string[/=/]
$'
=> "name=bob"

/=/ =~ string
$'
=> "name=bob"

$'是一个全局,在成功匹配后保持字符串。如果没有匹配的话,它是nil

答案 3 :(得分:1)

split(char)是可以使用的另一个功能。 例如,我们想从“ answer:computer”中获取char':'之前的子字符串,然后可以使用"answer:computer".split(':')[0]。因此,我们将结果作为“ answer”。

答案 4 :(得分:0)

使用String#match

您可以使用具有正向lookbehind的正则表达式来查找匹配项。例如:

string = "option=name=bob"
string.match /(?<==).*/
# => #<MatchData "name=bob">

使用匹配变量访问结果

即使您没有将匹配数据分配给变量,Ruby也会将其存储在特殊match variables中。

$&
# => "name=bob"