[#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:47550] Re: 正規表現で困っています

From: Yousuke Takahashi <yousuket@...>
Date: 2010-10-13 02:39:58 UTC
List: ruby-list #47550
高橋庸介といいます。

scanの正規表現だと思いますが、
最後にsplitしたものをpでダンプしてみると
["1", "4", "10001", "20101013", "1300", "1</SQL><SQL>1", "4", "1001",
"20101013", "1300", "1</SQL>"]
となると思います。

○<SQL></SQL>で要素に分かれていない
→scanがうまく行っていない?
てなわけで正規表現を少しいじってあげます

 tmp =  bodys.scan(/<SQL>.*?<\/SQL>/i);

これで最後のsqlオブジェクトは
["1", "4", "10001", "20101013", "1300", "1</SQL>"]
["1", "4", "1001", "20101013", "1300", "1</SQL>"]
2要素にわかれました。

○最後の</SQL>が取り除かれていない…
→サンプルが test = test.sub("<\/SQL><br\/>","") となっているため?
  test = test.sub("<\/SQL>","")
に修正してsqlオブジェクトをダンプ

["1", "4", "10001", "20101013", "1300", "1"]
["1", "4", "1001", "20101013", "1300", "1"]

多分、後者が問題ではないのでしょうが。

前者の解決方法については、
http://www.ruby-lang.org/ja/man/html/_C0B5B5ACC9BDB8BD.html
*?
量指定子(quantifiers)。 直前の表現の 0 回以上の繰り返し (最短一致)

最短一致というのが味噌です。?を付けた場合に一番短く文字列を探索に行きます。
付けない場合には文字列の最後からみるようなイメージですかね。

問題は解決できましたか?


2010年10月13日11:11 成田恭一[NWH] <ntnarita_prn@net-do.jp>:
> Ruby初心者の成田と申します。
>
> 以下のような文字列から<SQL>と</SQL>の間を切り出してカンマ区切りをsplitをつかって配列にいれようとしています
>
> 文字列は以下となります
> <SQL>1,4,10001,20101013,1300,1</SQL><SQL>1,4,1001,20101013,1300,1</SQL>
> とひとつの文字列にずらずらと<SQL>〜</SQL>を繰り返して入っているデータからカンマ区切りのデータだけ取り出したいのですが、
>  tmp =  bodys.scan(/<SQL>.*<\/SQL>/i);
>  tmp.each do |t|
>      test = t.sub("<SQL>","")
>      test = test.sub("<\/SQL><br\/>","")
>      sql = test.split(",")
>  とすると<SQL>がsqlという配列に入り込んでしまいうまく動作しません。正規表現が理解しきれていないのが原因です。どなたかお知恵をお貸しくださいませんか。

In This Thread