2011-11-03 9 views
34

私はRubyを初めて使用していて、数字の最初の出現を検索するのに常にString.scanを使用しています。返された値がネストされた配列であることは奇妙なことですが、私が望む値に対しては[0][0]に行きます。 (私はそれが目的を持っていると確信しています、まだ私はそれをまだ使用していません)Rubyの文字列のスキャンとマッチの違いは何ですか

私はちょうどString.matchメソッドがあることを知りました。返された配列はネストされていないので、より便利に思えます。ここで

は最初、2の例でスキャンです:

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

はその後、私はAPIをチェックしてきたが、私は本当に違いを区別することはできません、と一致

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

ですどちらも「パターンにマッチする」と言われています。

この質問は、単に好奇心のために、scanができることについては、matchはできません。 1つしか達成できない特定のシナリオのmatchは下位ですか?

答えて

40

短い回答:scanすべての一致が返されます。最初の試合だけが必要な場合、str.match[2]str.scan[0][1]よりもはるかに読みやすいので、これは優れていません。

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 
17

#scanは、正規表現と一致するものをすべて返します。ら、(それはインデックス0にマッピング何だ正規表現にマッチしたもの)$1(マッチ1)、$2

#match$&ような特殊な変数によって保持されたデータを含むMatchDataオブジェクトとして最初のマッチを返します。

関連する問題