ruby - 使用正则表达式查找字符串的一部分

标签 ruby regex

我有这样一个字符串:

"@[30:Larry Middleton]"

我只想返回 30。30 永远是数字,长度可以是 1 到无穷大。

我试过:

user_id = result.match(/@\[(\d+):.*]/)

但这会返回所有内容。我怎么才能拿回 30?

最佳答案

如果这真的是您的全部字符串,则无需匹配模式的其余部分;只匹配连续的整数:

irb(main):001:0> result = "@[30:Larry Middleton]"
#=> "@[30:Larry Middleton]"
irb(main):002:0> result[/\d+/]
#=> "30"

但是,如果您需要将其作为可能在其他地方有数字的较大字符串的一部分进行匹配:

irb(main):004:0> result[/@\[(\d+):.*?\]/]
#=> "@[30:Larry Middleton]"
irb(main):005:0> result[/@\[(\d+):.*?\]/,1]
#=> "30"
irb(main):006:0> result[/@\[(\d+):.*?\]/,1].to_i
#=> 30

如果您还需要名称:

irb(main):002:0> m = result.match /@\[(\d+):(.*?)\]/
#=> #<MatchData "@[30:Larry Middleton]" 1:"30" 2:"Larry Middleton">
irb(main):003:0> m[1]
#=> "30"
irb(main):004:0> m[2]
#=> "Larry Middleton"

在 Ruby 1.9 中,您甚至可以命名匹配项,而不是使用捕获编号:

irb(main):005:0> m = result.match /@\[(?<id>\d+):(?<name>.*?)\]/
#=> #<MatchData "@[30:Larry Middleton]" id:"30" name:"Larry Middleton">
irb(main):006:0> m[:id]
#=> "30"
irb(main):007:0> m[:name]
#=> "Larry Middleton"

如果您需要找到其中的许多:

irb(main):008:0> result = "First there was @[30:Larry Middleton], age 17, and then there was @[42:Phrogz], age unknown."
#irb(main):015:0> result.scan /@\[(\d+):.*?\]/
#=> [["30"], ["42"]]
irb(main):016:0> result.scan(/@\[(\d+):.*?\]/).flatten.map(&:to_i)
#=> [30, 42]
irb(main):017:0> result.scan(/@\[(\d+):(.*?)\]/).each{ |id,name| puts "#{name} is #{id}" }
Larry is 30
Phrogz is 42

关于ruby - 使用正则表达式查找字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960262/

相关文章:

ruby - 找不到 macOS Mojave 'ruby/config.h' 文件

ruby-on-rails - 关于基于浏览器的在线产品目录的开发框架的建议?

javascript - 无法验证密码是否为空

python - 如何在两个字符串之间进行模式匹配?

C++ regex Visual Studio Community 2015 <regex> 给出意外结果

ruby - 访问 ruby​​ 数据结构的元素

c - ruby C 扩展 : turning int function into ruby value

ruby - 检查方法中的参数是数组还是范围的更好方法

python - 没有运气找到正则表达式模式 python

php - 解析css并创建类名和背景图片的键值数组