Ruby on rails Ruby-将所有字符切分到字符串中的下划线

Ruby on rails Ruby-将所有字符切分到字符串中的下划线,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有这样一个字符串solution\u 10,我想从中删除solution\u部分,下划线后面的数字会增加,它可以是100,1000甚至更大。我似乎不知道该怎么做 我尝试过使用slice!(0,9)但这给了我解决方案,然后我尝试了切片!(0,-2)但这给了我空值 然后我尝试使用solution\u10[1..9]这给了我ortable\u1 所以我的问题是如何去掉所有字符,直到下划线,我只需要下划线后面的数字。使用方法 为什么不直接使用正则表达式呢 "solution_10".scan(/\d+

我有这样一个字符串
solution\u 10
,我想从中删除
solution\u
部分,下划线后面的数字会增加,它可以是
100
1000
甚至更大。我似乎不知道该怎么做

我尝试过使用
slice!(0,9)
但这给了我
解决方案
,然后我尝试了
切片!(0,-2)
但这给了我空值

然后我尝试使用
solution\u10[1..9]
这给了我
ortable\u1

所以我的问题是如何去掉所有字符,直到
下划线
,我只需要下划线后面的数字。

使用方法


为什么不直接使用正则表达式呢

"solution_10".scan(/\d+/).last
#=> "10"
另一种方式:

'solution_10'[/\d+/]
#=> "10"
我似乎不知道该怎么做

首先,它的快捷方式可以用很多种方式。一种方法是提供起始索引和长度:

如果事先知道长度,可以使用该变量。但由于字符串中的数字部分可能是
10
100
1000
,因此您不需要

另一种方法是提供一个范围,表示开始和结束索引:

在这个变体中,Ruby将为您确定长度。您还可以提供负索引,以便从末尾开始计数
-1
是最后一个字符,
-2
倒数第二个字符,依此类推

所以我的问题是如何去掉下划线之前的所有字符,我想要的只是下划线后面的数字

我们必须了解下划线的含义:

s = "solution_10"
i = s.index('_') #=> 8
s = 'foo_bar'
i = s.index('_') #=> 3
s[i+1..-1]       #=> "bar"
现在,我们可以通过以下方式获得从该索引到最后一个字符的子字符串:

s[i..-1] #=> "_10"
显然,我们只差一个,所以让我们加上1:

s[i+1..-1] #=> "10"
好了


请注意,这种方法不一定会返回数字(或数字字符串),它只会返回第一个下划线之后的所有内容:

s = "solution_10"
i = s.index('_') #=> 8
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
对于更健壮的解决方案,您可以将正则表达式传递到
切片
/
[]
,如其他答案中所示。下面是一个版本,它匹配一个带下划线的字符串,后跟字符串末尾的数字。捕获并返回数字部分:

"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

您可能可以使用
“solution_10”[/\d+\z/]
。如果您想使用
切片
,则使用
“solution_10”。切片(/\d+\z/)
括号是多余的。如果它们应该是捕获组,则必须将它们移动到正则表达式中。但这也不是必需的。有了修复@Stefan建议这一定是最简单的解决方案。它还有一个优点,就是它可以与
“我的解决方案\u 10”
一起使用<代码>'solution_10'。gsub(/\D/,'')#=>“10”是另一面。请注意,
split('')。如果字符串本身不包含下划线,则last
将返回字符串本身。在这种情况下,您可以使用
split(“''[1]
)使其返回
nil
。非常感谢您抽出时间并编写如此详细的解释:)这非常有帮助。
s = 'foo_bar'
i = s.index('_') #=> 3
s[i+1..-1]       #=> "bar"
s = 'foo'
i = s.index('_') #=> nil
s[i+1..-1]       #=> NoMethodError: undefined method `+' for nil:NilClass
"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