2012-04-24 13 views
6

対スキャンルビー(1.9.3)のドキュメントには、そのスキャンを意味すると思わ=〜は最初のオカレンスだけを返し、一方でそのルビー正規表現は=〜

  1. スキャンは、複数の一致を返すことを除いて=〜と同等です
  2. スキャンは一致データを返しますが、=〜はインデックスを返します。

ただし、次の例では、2つのメソッドが同じ文字列と式に対して異なる結果を返すようです。何故ですか?

1.9.3p0 :002 > str = "Perl and Python - the two languages" 
=> "Perl and Python - the two languages" 
1.9.3p0 :008 > exp = /P(erl|ython)/ 
=> /P(erl|ython)/ 
1.9.3p0 :009 > str =~ exp 
=> 0 
1.9.3p0 :010 > str.scan exp 
=> [["erl"], ["ython"]] 

最初の試合のインデックスが0である場合は、代わりに「ERL」と「パイソン」の復帰「のPerl」および「パイソン」をスキャンするべきではないのですか?

おかげ捕捉基なしで正規表現を与え

答えて

12

scanは、各文字列が、正規表現の一致を表す文字列の配列を返します。 scan(/P(?:erl|ython)/)(グループをキャプチャしない場合を除いて正規表現と同じ)を使用すると、["Perl", "Python"]が得られます。

ただし、キャプチャグループで正規表現を指定すると、scanは配列の配列を返します。各サブ配列には、特定の一致のキャプチャが含まれます。たとえば、正規表現(\w*):(\w*)がある場合、各サブ配列にはコロンの前の部分とコロンの後の部分の2つの文字列が含まれている配列の配列が得られます。そして、あなたの例では、各サブ配列は1つの文字列を含んでいます:部分は(erl|ython)と一致します。

+0

ありがとうございますので、スキャンは厳密に=〜と等価ではありません。 – Anand

+2

@Anandスキャンは〜〜とはまったく異なる何かを返すので、私はそれが同等であると言うことは決して正確ではないと思います。スキャンによって返される最初の結果は、 'exp'にキャプチャグループが含まれていない場合にのみインデックス' str =〜exp'で始まる部分文字列になります。それに加えて、最初の結果は 'regexp.last_match.string'と同等であると言うことができます。' regexp.last_match.string'は、キャプチャグループが含まれていない場合は 'str =〜exp'を実行した後に取得し、キャプチャグループを含まない場合は' Regexp.last_match.captures'キャプチャグループを含んでいます。 – sepp2k

+0

あなたが実際に学ぶことができるこの種の投稿を見ることはうれしいです。 – texasbruce