如何在一个字符串中找到一个整数,其中只有前面的字符是已知的,并且最多有2位数,在Ruby中

yzuktlbb  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(117)

我有一个字符串,

x = '4x4 @ 32" hjy w/ R43 potter'
x = '4x4 @ 32" hjy w/ R4 26 potter'
x = 'Restful4 4 @ 32" hjy R8 26 potter'

我需要得到前面有R的数字,即从第一个数字中得到43,从第二个数字中得到4,从第三个数字中得到8
一个R是有保证的。
我可以使用index('R')得到它,但这是痛苦的照顾所有的情况。
我试过匹配,但似乎不工作。任何想法?
我试过这个:

sFind = x.match /(?<name>R \d+) /
debug=debug+sFind[:name].to_s + "\n"


调试出错

7xllpg7q

7xllpg7q1#

您几乎已经完成了,只需删除R\d+之间的空格即可:

x = '4x4 @ 32" hjy w/ R43 potter'

x.match /(?<name>R \d+) / #=> nil
x.match /(?<name>R\d+) /  #=> #<MatchData "R43 " name:"R43">

字符串
还有String#[]可以立即提取捕获组:

x[/(?<name>R\d+) /, :name] #=> "R43"


仅获取数字:

x[/R(?<name>\d+) /, :name] #=> "43"


或者通过不使用命名捕获来缩短:

x[/R(\d+)/, 1] #=> "43"


您也可以使用所谓的 positive lookbehind Assert来匹配前面有R的数字,而不包括R

x[/(?<=R)\d+/] #=> "43"

ie3xauqp

ie3xauqp2#

使用扫描方法

x = "4x4 @ 32 hjy w/ R43 potter"
matches = x.scan(/R(\d{1,2})/)
puts matches.flatten.first

字符串
如果有多个R后面跟着这样的数字,则删除.first

x = "4x4 @ 32 hjy w/ R43 potter R4 26 potter"
matches = x.scan(/R(\d{1,2})/)
p matches.flatten


输出

"43"
["43", "4"]

相关问题