纯粹出于好奇,是否有更优雅的方法来简单地获取字符串中第一个=
符号后面的子字符串?以下作品回馈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
方法需要额外检查(因此不那么优雅)。
答案 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)
可能不是Ruby方式(它有点神秘),但你可以这样做:
string[/=/]
$'
=> "name=bob"
或
/=/ =~ string
$'
=> "name=bob"
$'
是一个全局,在成功匹配后保持字符串。如果没有匹配的话,它是nil
!
答案 3 :(得分:1)
split(char)
是可以使用的另一个功能。
例如,我们想从“ answer:computer”中获取char':'之前的子字符串,然后可以使用"answer:computer".split(':')[0]
。因此,我们将结果作为“ answer”。
答案 4 :(得分:0)
您可以使用具有正向lookbehind的正则表达式来查找匹配项。例如:
string = "option=name=bob"
string.match /(?<==).*/
# => #<MatchData "name=bob">
即使您没有将匹配数据分配给变量,Ruby也会将其存储在特殊match variables中。
$&
# => "name=bob"