55

スキャンから取得した文字列のキャプチャに名前を付けたいと思います。どうやってするの?

"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

しかし、それは戻ります

[]
4

6 に答える 6

98

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"}
于 2013-09-16T10:27:55.430 に答える
6

このようなもの?

"555-333-7777" =~ /^(?<area>\d+)\-(?<city>\d+)\-(?<local>\d+)$/
Hash[$~.names.collect{|x| [x.to_sym, $~[x]]}]
 => {:area=>"555", :city=>"333", :local=>"7777"}

ボーナス版:

Hash[[:area, :city, :local].zip("555-333-7777".split("-"))]
=> {:area=>"555", :city=>"333", :local=>"7777"}
于 2013-09-16T10:40:59.733 に答える
0

この代替手段も機能します。

regex = /^(?<area>\d+)\-(?<city>\d+)\-(?<local>\d+)$/
m = "555-333-7777".match regex
m.named_captures
 => {"area"=>"555", "city"=>"333", "local"=>"7777"}
于 2022-01-26T16:17:05.660 に答える