• ベストアンサー

正規表現 たのしいRuby

たのしいRubyを買ってきて勉強しているのですが、 分からなくて躓いてきて、だんだん楽しくなくなってきたので 誰か教えてください。 ■1.P268 □パターン / ^(ABC)?$ / □文字列 "" □マッチする部分 "→←" となっているのですが、ABCが繰り返されてもいないのにマッチしている理由が分かりません。 ■2.P268 □パターン / ^(ABC)?$ / □文字列 "ABCABC" □マッチする部分 "マッチしない" となっているのですが、ABCが繰り返されてもいるのにマッチしない理由が分かりません。 ■3.P272 □パターン / (ドット)(/d/d)+(ドット) /=~ "123456" p $1 # => "1" p $2 # => "45" p $3 # => "6" となっているのですが、p $2 # => "45"と書かれている理由が分かりません。(p $2 #= > "23"だと思うのですが…) ■4.P272 □パターン /(ドット)(?:/d/d)+(ドット)/ =~ "123456" p $1 # => "1" p $2 # => "6" となっています。しかし、p $2 は、(ドット)(?:/d/d)+(ドット)/ の部分を指すのだと思っているのですが、何がどうなっているのかさっぱり分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • siffon9
  • ベストアンサー率64% (136/211)
回答No.3

「?」は、直前の正規表現の 0 または 1 回の繰り返しです。 従って 1  行頭~行末間にABCがない = ABCの0回の繰り返し にマッチ 2  ABCABCは、行頭~行末間に2回繰り返しがあるからマッチしない 3  順番にマッチさせていくと  $1 = "1"  $2 = "23"  $2 = "45"  $3 = "6"  $2には最後にマッチした"45"が入ります。 4  (?: )は、後方参照を伴わないグループ化で$1, $2などの対象にはなりません  なので (?:\d\d)+ にマッチする"2345"はスキップされて、その次にマッチした"6"が$2に代入されます。 下のURLにマニュアルがありますのでご覧ください。

参考URL:
http://www.ruby-lang.org/ja/man/html/_C0B5B5ACC9BDB8BD.html
re999
質問者

お礼

大変分かりやすいご回答ありがとうございます。 おかげで理解することができました。 ■1.「?」は、直前の正規表現の 0 または 1 回の繰り返し  この記述、テキストにもありましたが、見落としていました。 ■2.ABCABCは、行頭~行末間に2回繰り返しがあるからマッチしない  ABCABCは、繰り返し1回だと思い込んでいました。おかげで理解することが出来ました。 ■3.$2には最後にマッチした"45"が入ります。  後方参照の意味が理解できました。 ■4.後方参照を伴わないグループ化で$1, $2などの対象にはなりません  これはちょっと分かりにくかったのですが、回答と参考urlを元に再度テキストを読み返してみたところ、理解することができました。  ありがとうございます!   おかげで、ちょっとRubyが楽しくなってきたような気が(?)します。

その他の回答 (2)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> / (ドット)(/d/d)+(ドット) /=~ "123456" ドットって . のこと?それならちゃんと . を使わないと意味が全然違う。 それと、 / と ( の間などにスペースがあるけど、これは必要? あと /d は \d じゃないの?(スラッシュじゃなくてバックスラッシュ。バックスラッシュは円記号に見えることも多いけど。) > p $2 # => "45"と書かれている理由が分かりません。(p $2 #= > "23"だと思うのですが…) 量指定子を使ったときに後方参照で参照できるのは 最後にマッチした文字列です。

re999
質問者

お礼

ご回答ありがとうございます。 ■ドットって . のこと?それなら . を使わないと意味が全然違う。 .ならちゃんと表示されるのですが、()に入れると文字化けしたため、止むを得ず(ドット)と表記しました。 ■それと、 / と ( の間などにスペースがあるけど、これは必要? 間のスペースは不用なのですが、スペースを外したところ余りにも見にくかったため、敢えてスペースを入れてみました。 ■後方参照で参照できるのは最後にマッチした文字列です。 ありがとうございます。後方参照の意味がよく分かりました。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

そのまま答えを書いてあげられないのでヒントだけ 1 「?」について 2 「?」の回数について 3 「最長一致」について(だったと思う) 4 「?:」について それぞれ調べてごらん http://www.google.com/search?lr=lang_ja&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%20%E5%85%A5%E9%96%80

関連するQ&A