2012-02-29 10 views
0

正規表現を使用して"John Doe"を返したいと思います。Regexのヘルプとガイダンス

string = "{name} John Doe {phone} 555-5555" 

本当に正規表現をマスターしたいと思っています。どうやって学びましたか?

+0

正規表現を学ぶ最も良い方法は、自分で多くのことを理解し、必要が最も多い時にstackoverflowで尋ねることです。 lupacetteの最初のリンクは、正規表現を試して任意の文字列に対してテストできるrubularです。 –

+0

私はちょうど私のピックアックスブックを取り出し、先読み/裏を見つけました。私は私が必要としていたものを、次のように使うこともできました:(?<= {name})[A-Za-z] +それは価値ある使用ですか? – Steve

+0

ああ、実際は。それは名前が2つの単語であるためには機能しません。 Rubularは間違いなくこれらを学ぶのに役立ちます。 – Steve

答えて

1

このような場合は、トークン化して中間表現を使用するのが最善の方法です。 String#scanが繰り返しパターンからデータを抽出するための素晴らしいです:

string = "{name} John Doe {phone} 555-5555" 

string.scan(/\{([^}]+)\}\s+([^\{]+)/).collect { |s| s.each { |c| c.sub!(/\s+$/, '') } } 
# => [["name", "John Doe"], ["phone", "555-5555"]] 

あなたも、非常に簡単にハッシュにこれを再マッピングすることができます:

Hash[string.scan(/\{([^}]+)\}\s+([^\{]+)/).collect { |s| s.each { |c| c.sub!(/\s+$/, '') } }] 
# => {"name"=>"John Doe", "phone"=>"555-5555"} 

を正規表現をマスターするための鍵は、最初にそれらを読む方法を学んでいます、彼らがどのようにふるまうか見るためにたくさん試してみてください。 Rubularのようなツールを使って探検に役立つことができますが、調べる価値のある本についてはいくつかの良い本があります。 O'Reillyはかなり強固な選択肢を持っていますが、他にもあります。

私の経験は、たいていの場合、正規表現を使用するPerlから来ています。

+0

うわー。まさに私が探していたもの。私が思い描いていた解決策は非常に脆く、非常に冗長でした。ハッシュのためにそれぞれを収集することは、私がやっていることに最適です。ありがとうございました!私は彼らについて今勉強していますが、私は習慣的に先をスキャンするときに自分自身を大げさにすると思います。 Regexesはますます複雑になるように見えるので、私が動機をとるのは難しいです。 – Steve

+1

正規表現には複雑な見た目の構文があるかもしれません。最初はラインノイズのように見えますが、単純なステートマシンを定義する方法です。それらを読み書きすることを学ぶと、複雑さは消滅し、ユーティリティは多くの言語にまたがります。ほとんどはまっすぐなもので、「1つ以上の単語の文字の後に続けて、括弧で囲まれていない文字が続きます」のように読み込まれますので、落胆しないでください! – tadman

1

これを実行する方法はたくさんあります。ちょうど最初の試み:

/\{name\}(.+)\{phone\}/ 

Aテストhere。私は読書thisの本を学んだ。

+0

Rubularを紹介していただきありがとうございます!私がテスト目的のために探していたもの。 – Steve

+0

はい、Rubularは、テストや学習に非常に適しています。 – lucapette

関連する問題