我想命名从扫描中获取的字符串捕获.怎么做?

"555-333-7777".scan(/(\d{3})-(\d{3})-(\d{4})/).flatten #=> ["555", "333", "7777"]

有可能把它变成这样吗

{:area => "555", :city => "333", :local => "7777" }

[["555","area"], [...]]

我试过了

"555-333-7777".scan(/((?<area>)\d{3})-(\d{3})-(\d{4})/).flatten

但它回来了

[]

推荐答案

你应该在命名捕获中使用match,而不是scan

m = "555-333-7777".match(/(?<area>\d{3})-(?<city>\d{3})-(?<number>\d{4})/)
m # => #<MatchData "555-333-7777" area:"555" city:"333" number:"7777">
m[:area] # => "555"
m[:city] # => "333"

如果你想要一个实际的散列,你可以使用如下内容:

m.names.zip(m.captures).to_h # => {"area"=>"555", "city"=>"333", "number"=>"7777"}

或者这个(ruby 2.4或更高版本)

m.named_captures # => {"area"=>"555", "city"=>"333", "number"=>"7777"}

Ruby相关问答推荐

无法解析音频文件 track1.m4a

如何使用 HEREDOC 作为参数传递给方法?

get.chomp() 与 STDIN.gets.chomp() 有什么区别?

减少哈希值

Ruby 中的 STDIN 和 $stdin 有什么区别?

出于调试目的,如何打印有关 NET:HTTPRequest 的信息?

Ruby:如何卸载设计(uninstall Devise)?

如何在没有继承方法的情况下获取类的公共方法?

Ruby 的 File.open 给出没有这样的文件或目录 - text.txt (Errno::ENOENT)错误

Ruby 中的 -> (stab) 运算符是什么?

Sinatra 是多线程的吗?

如何在课堂上使用 Enumerable mixin?

Ruby 1.9:如何正确大写和小写多字节字符串?

判断字符串是否为空的Ruby方法?

如何合并 Ruby 哈希

如何使用密码保护我的 /sidekiq 路由(即需要对 Sidekiq::Web 工具进行身份验证)?

判断整数是否在范围内

Ruby 疯狂:类与对象?

如何在 Ruby 循环的第一次迭代中采取不同的行动?

你可以在Ruby中使用分号吗?