6

Ruby (1.9.3) のドキュメントは、 scan が =~ と同等であることを暗示しているようです。

  1. scan は複数の一致を返しますが、=~ は最初の一致のみを返します。
  2. scan は一致データを返し、=~ はインデックスを返します。

ただし、次の例では、同じ文字列と式に対して 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" と "python" の代わりに "Perl" と "Python" を返すべきではありませんか?

ありがとう

4

1 に答える 1

12

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

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

于 2012-04-24T03:42:04.517 に答える