2012-03-09 12 views
11

わかりやすい名前付きキャプチャを使用してユーザー入力を解析する必要があります。Rubyのケースで正規表現で名前付きキャプチャを使用するときはいつですか?

コマンドを入力するときに、いくつかのパラメータを取得して渡す必要があります。私はcase文でRegExpsを使用しているので、返す値を/pattern/.named_capturesに割り当てることはできません。ここで

は、私が(例えば)行うことができるようにしたいものです。名前の

while command != "quit" 
    print "Command: " 
    command = gets.chomp 
    case command 
    when /load (?<filename>\w+)/ 
    load(filename) 
    end 
end 
+0

これは賢明な方法では可能ではないと私は考えています。しかし、 "魔法のキャプチャ変数"( '$ n')はまだ利用可能なはずです...なぜ私は-1 :( –

+1

ええ、私は$ 1を使うことができましたが、Rubyは可読性に優れています。 – Chris

答えて

13

設定されたローカル変数この構文をキャプチャします。

regex-literal =~ string 

他の構文で設定されていません。 #rdoc(re.c)

regex-variable =~ string 

string =~ regex 

regex.match(string) 

case string 
when regex 
else 
end 

私は名前付きキャプチャも好きですが、私はこの動作が気に入らないのです。 ここでは、文法の場合に$〜を使用する必要があります。

case string 
when /(?<name>.)/ 
    $~[:name] 
else 
end 
+1

$ [〜:name]は私のためには機能しませんでしたが、$〜[:name]は(他の回答ごとに)しました – Lynn

+0

残念ですが、Perlに戻ることを望んでいます。 @Lynn – kachick

+0

FWIW、RuboCopは '$〜'の代わりに '$ LAST_MATCH_INFO'を使うことを推奨します。[More info](https://github.com/bbatsov/ruby) - スタイルガイド#no-cryptic-perlisms) – backpackerhh

7

これは醜いですが、Rubyの1.9.3で私の作品:

while command != "quit" 
    print "Command: " 
    command = gets.chomp 
    case command 
    when /load (?<filename>\w+)/ 
    load($~[:filename]) 
    end 
end 

代わりにあなたが$~$LAST_MATCH_INFOの英語の拡張機能を使用することができます。

関連する問題