- ベストアンサー
正規表現 matchメソッド
Ruby認定試験対策問題の解説の中で、分からない箇所があったので、教えてください。 ■問題9の一部 s = "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." /sheet/.match(s).length ■説明 文字列sの中と正規表現/sheet/にマッチした全体の文字列とマッチした部分文字列の配列の数を取得します。 ■回答 => 1 ■irbで自分なりに試してみた内容 irb> s = "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." => "I slit the sheet, the sheet I slit, and on the slitted sheet I sit." irb> /sheet/.match(s).length => 1 irb> /sheet/.match(s) => #<MatchData:0x2c28d30> irb> /sheet/.match(s).class => MatchData irb> /sheet/.match(s).to_a => ["sheet"] irb> /sheet/.match(s).offset(0) => [11, 16] ■疑問 ・match(s).lengthの答えが、どうして1になるか分からない。 ・説明の中の「正規表現/sheet/にマッチした全体の文字列」とは何を指すのか? ・説明の中の「マッチした部分文字列の配列」が何を意味しているか? ・返ってきたMatchData オブジェクトの中身は何? [11, 16]だけってこと? 一応、リファレンスも覗いてみたのですが、そこに掲載されていた内容もよく理解できませんでした。 http://www.ruby-lang.org/ja/man/html/Regexp.html#match bar = /foo(.*)baz/.match("foobarbaz").to_a[1] foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz").to_a.values_at(1,2,3) さらに、そこに掲載されていた「正規表現にマッチした部分文字列だけが必要な場合に」 ってのは、どういう意味なのでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>・説明の中の「正規表現/sheet/にマッチした全体の文字列」とは何を指すのか? /sheet/にマッチする文字列は "sheet" です。 >・説明の中の「マッチした部分文字列の配列」が何を意味しているか? 部分文字列とは、カッコに囲まれた正規表現の一部分にマッチする文字列のことですが、/sheet/ にはカッコがないので部分文字列はありません。 >・match(s).lengthの答えが、どうして1になるか分からない。 マッチした文字列が1個で、部分文字列が0個なので全体で1個。 >・返ってきたMatchData オブジェクトの中身は何? マッチした結果の様々な情報。 [11, 16]もその1つです。 アドバイスとしては、学校の受験勉強じゃないので、問題集と参考書で勉強するのは無理です。 「Ruby認定試験対策問題」はRubyでプログラミングを出来る人が、その技術レベルを認定してもらうための試験なので、まずはプログラミングをしてみましょう。
その他の回答 (1)
- koko_u_
- ベストアンサー率18% (459/2509)
>・match(s).lengthの答えが、どうして1になるか分からない。 リファレンスに MatchData#length は self.to_a.size と同じだとあります。 そこで MatchData#length.to_a の説明を読むと "$&, $1, $2, ... " を格納した配列とあります。 次に $& の説明を読むと「最後に成功した正規表現のパターンマッチでマッチした文字列」とあります。 今回のケースでは正規表現に () によるグループ化が含まれていないので、マッチする部分文字列はありません。 単純にマッチした文字列 $& だけが得られます。 /(shee)t/.match(s) とすれば、$& が sheet、$1 が部分文字列 shee になります。