Techioz Blog

Ruby文字列のスキャンとマッチの違いは何ですか

概要

私は Ruby を初めて使用するので、最初に出現する数値を検索するために常に String.scan を使用してきました。戻り値が入れ子配列になっているのはちょっと奇妙ですが、必要な値を [0][0] にするだけです。 (私はまだ使用していないだけで、目的はあると思います。)

String.match メソッドがあることを知りました。また、返される配列がネストされていないため、より便利なようです。

以下は 2 つの例です。最初はスキャンです。

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

それなら一致です

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

API を確認しましたが、どちらも「パターンに一致する」と呼ばれているため、違いを区別することはできません。

この質問は、単純に言うと、スキャンでできて一致ではできないこと、またはその逆についての質問です。一人だけが達成できる特定のシナリオはありますか?マッチはスキャンより下位ですか?

解決策

簡単な答え: スキャンすると、一致したものがすべて返されます。最初の一致のみが必要な場合は、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"]