2011-03-14 6 views
1

これは単なる一般的なものです。私の正規表現では、私が期待したすべてのものを引き出すのは間違っています。Ruby Regexのマッチングヘルプ

は、ここに私の文字列です:

"Mon 0900-1600 1700-2000" 

と私は時間"0900-1600""1700-2000"を引き出すことができるようにしたいと思います。

これは私のregexp /([0-9]{4}-[0-9]{4})/であり、最初の時刻を見つけるのには大変効果的ですが、2番目の時刻に一致するものは返しません。誰かが私に理由を教えてもらえますか?ここで

は、レコードのための私の実際のコードスニペットです:

str = "Mon 0900-1600 1700-2000" 

/([0-9]{4}-[0-9]{4})/.match(str) #<MatchData "0900-1600"> 

答えて

4

ではなくstring#scanを使用してみてください:

ruby-1.9.2-p136 :001 > str = "Mon 0900-1600 1700-2000" 
=> "Mon 0900-1600 1700-2000" 
ruby-1.9.2-p136 :002 > str.scan /([0-9]{4}-[0-9]{4})/ 
=> [["0900-1600"], ["1700-2000"]] 
+0

はい、これは私が探していたまさにです、ありがとうございました。 – TheDelChop

1

なぜ文字列#分割を使わないのでしょうか?

asdf = "Mon 0900-1600 1700-2000" 
asdf.split(' ')[1,2] #=> ["0900-1600", "1700-2000"] 

それ以外の場合は簡略化し、使用:

asdf.scan(/\d+-\d+/) #=> ["0900-1600", "1700-2000"] 
+0

'split'は単純なパターンに従いたい部分文字列が単純なパターンに従うときに良いですが、' scan'は単純なパターンに従いたい部分文字列が良いときに良いです。この場合、それは間違いなく後者です。私はあなたがこの場合に分割を使うべき理由を見ない。 – sawa

+0

@sawa、「間違いなく」ありません。私たちが問題について知っているのは、OPが言ったことだけです。説明に基づいてどちらも適切ですが、分割は簡単です。 –

+0

ここで 'split'を使うには2つのステップが必要です。 '' Mon ''を取り除くには' [1,2] 'をしなければなりません。これは、スローしたい最初の部分文字列( '' Mon "')とセパレータ '" "'が同質でないためです。あなたの2番目の例では 'scan'のように1ステップで行うよりも複雑ではありませんか? – sawa

関連する問題