Ruby - 将所有字符切片直到字符串中的下划线

时间:2017-06-16 06:41:04

标签: ruby-on-rails ruby

我有一个类似solution_10的字符串,我想从中删除solution_部分,下划线后的数字会增加,可以是100,{{1甚至更大。我似乎无法解决如何做到这一点。

我尝试使用1000,但这会给我slice!(0, 9),然后我尝试了solution_但是这给了我null,

然后我尝试使用slice!(0, -2)这给了我solution_10[1..9]

所以我的问题是如何摆脱所有角色,直到ortable_1,我想要的只是下划线后面的数字。

5 个答案:

答案 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
#  ^^^

如果您事先知道长度,则可以使用该变体。但由于字符串中的数字部分可能是101001000,因此您不会。

另一种方法是提供一个范围,表示 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"