[#47529] ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — jugyo kohno <kkohno@...>

jugyo と申します

11 messages 2010/10/08
[#47562] Re: ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — "Y. NOBUOKA" <nobuoka@...> 2010/10/15

信岡です。

[#47537] Excel用のxmlssファイルを作成するライブラリ exlap_c — "YOSHIIZUMI" <t-yoshiizumi@...>

 吉泉といいます。

11 messages 2010/10/10

[ruby-list:47553] Re: 正規表現で困っています

From: Seiichi Miyagawa <miyagawa@...>
Date: 2010-10-13 06:51:55 UTC
List: ruby-list #47553
問題は解決したようですが、ちと悩んだので覚書として投稿しておきます。

まずは、scanは括弧をつけるとそこだけ返すので、

bodys =%Q[<SQL>1,4,10001,20101013,1300,1</SQL><br/><SQL>1,4,1001,20101013,1300,1</SQL>]
bodys.scan(%r"<SQL>(.*?)</SQL>"){|v| p v[0].split(',')}

で、subしなくても出来るなぁ、と思いましたが、
更にsplitも無しに出来ないのかなぁとしばらく悩みました。


個数が固定なら ずらずら並べて、
bodys.scan(%r"<SQL>(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)</SQL>"){|v| p v}
でも、これでは個数が変わったらアウトだし、rubyっぽくないのでsplitの方がまだまし。

それで、
bodys.scan(%r"<SQL>(?:([^,]+?),)*?([^,]*?)</SQL>"){|v| p v}

などと書いてみたのですが、これでは括弧の数だけしか取れません。
(?:([^,]+?),)*? では最後のマッチが残るだけで繰り返した分が無くなります。
多分、last_matchが括弧の数だけしか使われないのでしょう。

で、悩んだ末、先読みを使えばsplit無しで一応全部取り出せることは分りました。
一個ずつというのが欠点ですね。簡略化のためデータは整数だけとしてます。

bodys.scan(%r"(\d+?)(?=(?:,\d+?)*</SQL>)"){|v| p v}

まあ、悩まずにsplitしてしまうのが、データの区切りもハッキリするし、
多分速いだろうし、更に、分りやすくて良いと思います。


In This Thread

Prev Next