• ベストアンサー

/(.)(\d\d)+(.)/ =~ "123456"のとき、 p $

/(.)(\d\d)+(.)/ =~ "123456"のとき、 p $2とすると、"45"となるのはなぜですか? p $2 #=>23 となると思っていました。 そして、いったい23はどうすれば後方参照できるのですか?

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

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

(\d\d)+ は、2つの数字の1回以上の繰り返しですから、"23"と"45"にマッチします。 ですから、$2には最後にマッチした"45"を指すことになります。 もし対象の文字列が"12345"であれば、"23"と"45"にマッチさせると最後の(.)にマッチする文字が無くなってしまうので、$2は"23"になりますね($3は"4") > いったい23はどうすれば後方参照できるのですか? /(.)(\d\d)/ =~ "123456" p $2 ではダメでしょうか?

ghfjri
質問者

お礼

いつも回答ありがとうございます。 的確な説明に感謝しています。 よくわかりました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

元の意味を出来るだけ保つなら、 /(.)(\d\d)(\d\d)*(.)/ =~ "123456" p $2 でしょうね。

ghfjri
質問者

お礼

回答ありがとうございます。 そうなりますね。

回答No.2

「23」と「45」と言ったマッチした部分全てが必要な場合には、 scanを利用してみてはいかがでしょうか? =~では、最後にマッチした文字列のみが取得されます。 "123456".match(/.(\d+)./)[1].scan(/\d\d/) #["23", "45"]

ghfjri
質問者

お礼

回答ありがとうございます。 matchを使うとマッチさせる開始部分を指定できるんですね。 初めて知りました。

関連するQ&A