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