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

how to find an integer in a string in which only the preceeding character is known, and there is a max of 2 digits, in Ruby

提问人:jay 提问时间:10/30/2023 最后编辑:Stefanjay 更新时间:11/1/2023 访问量:84

问:

我有一个字符串,例如

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

我需要获取前面的数字,即 从第一个,从第二个,从第三个。R4348

保证大写字母 R。

我可以使用它,但这对处理所有情况都很痛苦。index('R')

我尝试了匹配,但似乎不起作用。有什么想法吗?

我试过这个:

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

调试出现错误

Ruby 字符串

评论

0赞 Stefan 10/30/2023
关于你的例子:字符串中有一个字符(之后)。您必须转义它或使用其他分隔符。否则,它将结束字符串。"@ 32
0赞 Cary Swoveland 10/31/2023
如果要求不高,请回复要求澄清的评论。
0赞 jay 11/1/2023
是的,“被转义了。我没有把它放在那里,因为我想展示实际的字符串是什么。对于造成的混乱,我深表歉意
0赞 jay 11/1/2023
是的,它应该返回 8 而不是第三个返回 4。我的错误

答:

1赞 Rajagopalan 10/30/2023 #1

使用扫描方式

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"]
3赞 Stefan 10/30/2023 #2

你快到了,只需删除 和 之间的空格: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"

您还可以使用所谓的正 lookbehind 断言来匹配前面的数字,但不包括:RR

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

评论

0赞 Rajagopalan 10/30/2023
WILL 做什么?<name>
1赞 Stefan 10/30/2023
@Rajagopalan它是一个命名的捕获组。
0赞 jay 10/31/2023
不过,我不希望返回 R,只希望返回 4 或 43
0赞 Stefan 10/31/2023
@jay 如果您不想捕获,请将其移出捕获组,例如R/R(?<name>\d+) /