50

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

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

只是感觉不是很Ruby。这也有效:

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

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

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

我不得不想象这是一个非常普遍的情况,不是有string.after('=')类型方法吗?考虑到这种操作在 Web 上的使用频率,Ruby on Rails 是否提供了类似的功能?

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

4

6 回答 6

85

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

string.partition('=').last

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

于 2012-12-28T18:11:33.533 回答
13

还有这种方式:

string.partition('=')[2]

和这个:

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

不过,我想我更喜欢你提到的正则表达式方式。

于 2012-12-28T18:11:08.050 回答
4

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

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

或者

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

$'是匹配成功后保存字符串的全局变量。如果nil没有任何匹配,也是!

于 2012-12-28T18:10:19.520 回答
1

使用字符串#match

您可以使用正则表达式和正则表达式来查找匹配项。例如:

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

使用匹配变量访问结果

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

$&
# => "name=bob"
于 2012-12-29T18:05:57.707 回答
1

split(char)是另一个可以使用的功能。例如,我们想从 "answer:computer" 中获取 char ':' 之前的子字符串,那么我们可以使用"answer:computer".split(':')[0]. 所以,我们会得到结果为 "answer"。

于 2018-06-20T06:26:18.130 回答
0

而不是使用string.split('=', 2)[1]你可以使用数组分解

# assuming your string represents a key=value pair
key, value = string.split('=', 2)

虽然这个解决方案不适合单行,但我确实觉得它很干净。

于 2021-08-26T18:40:33.703 回答