我有一个类似solution_10
的字符串,我想从中删除solution_
部分,下划线后的数字会增加,可以是100
,{{1甚至更大。我似乎无法解决如何做到这一点。
我尝试使用1000
,但这会给我slice!(0, 9)
,然后我尝试了solution_
但是这给了我null,
然后我尝试使用slice!(0, -2)
这给了我solution_10[1..9]
所以我的问题是如何摆脱所有角色,直到ortable_1
,我想要的只是下划线后面的数字。
答案 0 :(得分:6)
使用String#split
方法
'solution_10'.split('_').last #will return original string if no underscore present
#=> "10"
'solution_10'.split('_')[1] #will return nil if no underscore present
#=> "10"
答案 1 :(得分:5)
"solution_10"[/(?<=_).*/]
#⇒ "10"
或只是获取数字直到行尾:
"solution_10"[/\d+\z/]
#⇒ "10"
答案 2 :(得分:4)
另一种方式:
'solution_10'[/\d+/]
#=> "10"
答案 3 :(得分:4)
我似乎无法理解如何做到这一点。
首先,slice
及其快捷方式[]
可以在很多方面使用。一种方法是提供开始索引和长度:
'hello'[2, 3] #=> "llo" # 3 characters, starting at index 2
# ^^^
如果您事先知道长度,则可以使用该变体。但由于字符串中的数字部分可能是10
或100
或1000
,因此您不会。
另一种方法是提供一个范围,表示 start 和 end 索引:
'hello'[2..3] #=> "ll" # substring from index 2 to index 3
# ^^
在此变体中,Ruby将为您确定长度。您还可以提供从最后开始计算的负数指数。 -1
是最后一个字符,-2
是倒数第二个字符,依此类推。
所以我的问题是如何摆脱所有字符直到下划线,我想要的只是下划线后面的数字。
我们必须得到下划线的index
:
s = "solution_10"
i = s.index('_') #=> 8
现在我们可以通过以下方式从该索引获取子字符串到最后一个字符:
s[i..-1] #=> "_10"
显然,我们已经离开了,所以让我们加1:
s[i+1..-1] #=> "10"
你去。
请注意,此方法不一定会返回一个数字(或数字字符串),它只会返回第一个下划线后的所有内容:
s = 'foo_bar'
i = s.index('_') #=> 3
s[i+1..-1] #=> "bar"
如果字符串不包含下划线,它也会失败,因为i
将是nil
:
s = 'foo'
i = s.index('_') #=> nil
s[i+1..-1] #=> NoMethodError: undefined method `+' for nil:NilClass
对于更强大的解决方案,您可以将正则表达式传递给slice
/ []
,如其他答案中所示。这是一个匹配下划线后跟字符串末尾的数字的版本。捕获并返回数字部分:
"solution_10"[/_(\d+)\z/, 1] #=> "10"
# _ literal underscore
# ( ) capture group (the `1` argument refers to this)
# \d+ one or more digits
# \z end of string
答案 4 :(得分:2)
为什么不使用正则表达式
"solution_10".scan(/\d+/).last
#=> "10"