From: Seiichi Miyagawa Date: 2010-10-13T15:51:55+09:00 Subject: [ruby-list:47553] Re: 正規表現で困っています 問題は解決したようですが、ちと悩んだので覚書として投稿しておきます。 まずは、scanは括弧をつけるとそこだけ返すので、 bodys =%Q[1,4,10001,20101013,1300,1
1,4,1001,20101013,1300,1] bodys.scan(%r"(.*?)"){|v| p v[0].split(',')} で、subしなくても出来るなぁ、と思いましたが、 更にsplitも無しに出来ないのかなぁとしばらく悩みました。 個数が固定なら ずらずら並べて、 bodys.scan(%r"(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)"){|v| p v} でも、これでは個数が変わったらアウトだし、rubyっぽくないのでsplitの方がまだまし。 それで、 bodys.scan(%r"(?:([^,]+?),)*?([^,]*?)"){|v| p v} などと書いてみたのですが、これでは括弧の数だけしか取れません。 (?:([^,]+?),)*? では最後のマッチが残るだけで繰り返した分が無くなります。 多分、last_matchが括弧の数だけしか使われないのでしょう。 で、悩んだ末、先読みを使えばsplit無しで一応全部取り出せることは分りました。 一個ずつというのが欠点ですね。簡略化のためデータは整数だけとしてます。 bodys.scan(%r"(\d+?)(?=(?:,\d+?)*)"){|v| p v} まあ、悩まずにsplitしてしまうのが、データの区切りもハッキリするし、 多分速いだろうし、更に、分りやすくて良いと思います。