我有一个像这样的字符串:
"@[30:Larry Middleton]"
Run Code Online (Sandbox Code Playgroud)
我想只返回30.其中30将始终为数字,并且长度可以为1到无穷大.
我试过了:
user_id = result.match(/@\[(\d+):.*]/)
Run Code Online (Sandbox Code Playgroud)
但这会归还一切.我怎么能回到30?
如果这真的是你的所有字符串,你不需要匹配模式的其余部分; 只匹配连续的整数:
irb(main):001:0> result = "@[30:Larry Middleton]"
#=> "@[30:Larry Middleton]"
irb(main):002:0> result[/\d+/]
#=> "30"
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要将此匹配作为可能在其他位置具有数字的较大字符串的一部分:
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
Run Code Online (Sandbox Code Playgroud)
如果您还需要该名称:
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"
Run Code Online (Sandbox Code Playgroud)
在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"
Run Code Online (Sandbox Code Playgroud)
如果您需要找到其中许多:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |