- ベストアンサー
Rubyにおける正規表現(一致しない)
Rubyを使って、テキスト処理をやっています。 どうしても、うまく行かないところがあります。 サジェスチョンをお願いします。 正規表現にて、 2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。 1行の内容は、textに入っています。 if (myFlag1==1) && (myFlag2==1) && (!/abc def/) then xxxxxxxx end (!/abc def/)は、perlでの表現です。Rubyでは、少なくとも (!/abc def/=~text) かな、と考えましたが、ダメでした。 (/abc def/!=text) でも、だめでした。 宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> if (myFlag1==1) && (myFlag2==1) && (!/abc def/) then > (!/abc def/=~text) > かな、と考えましたが、ダメでした。 > (/abc def/!=text) > でも、だめでした。 > (/NONE/!=text) != じゃなくて !~ では? それと > パターンとして、NONEと言う文字列が入っている場合には、処理を飛ばしたいのです。 こういうときはいたずらに条件を複雑にするのではなくて、 while text = f.gets do next if /NONE/ =~ text if (/.../) then end end のように分けた方がスッキリしてわかりやすくなると思います。
その他の回答 (1)
- guci-ok
- ベストアンサー率33% (49/146)
動作するソースを出して下さい。 以下の2つのプログラムは、正しい動作をしていると思いますが、 どうでしょうか? 「myFlag1」の1は全角のままにしておきました。 #!ruby -Ks で行けるはず。 D:>ruby t1.rb OKだぁ D:>ruby t2.rb NGだぁ t1.rb ------------------------ #!ruby -Ks myFlag1 = 1 myFlag2 = 1 text = "abc def" if (myFlag1 == 1) && (myFlag2 == 1) && (text =~ /abc def/) then puts "OKだぁ" else puts "NGだぁ" end ------------------------ t2.rb ------------------------ #!ruby -Ks myFlag1 = 1 myFlag2 = 1 text = "abc def" if (myFlag1 == 1) && (myFlag2 == 1) && (text !~ /abc def/) then puts "OKだぁ" else puts "NGだぁ" end ------------------------
補足
guci-okさん、ありがとうございます。 小生の現状を正確に記述します。 入力ファイル(名称:test.log) aaaa bbbbb cccc dddd eeeee ffff ggggg NONE NONE NONE xxxx 期待する出力ファイル(名称:file_Status.txt) aaaa bbbbb cccc dddd eeeee ffff ggggg 現状のRubyスクリプト 上記入力ファイルは、C:\Program Files\RDE\myData\xxx_2007\Dataに置いています Dir.chdir('C:\Program Files\RDE\myData\xxx_2007\Data') print Dir.getwd,"\n" dir = Dir.open('C:\Program Files\RDE\myData\xxx_2007\Data') file_status=open("file_Status.txt", "w+") while myFilename=dir.read if /.log/i =~myFilename file_source_body=open(myFilename, "r") while text=file_source_body.gets do if (/^(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)/=~text) && (/NONE/!=text) then file_status.print text,"\n" end end file_source_body.close end end file_status.close dir.close 現状のスクリプトの出力 aaaa bbbbb cccc dddd eeeee ffff ggggg NONE NONE xxxx --------------------- 2行目のNONEが出ていないのは、(/NONE/!=text)で抑えているから、当たり前ですが、 3行目の”NONE NONE xxxx”が出ているのは、困ります。 パターンとして、NONEと言う文字列が入っている場合には、処理を飛ばしたいのです。 ------------------- ここで、改めて、問題点は、 (1)その行のなかに、「あるパターンの文字列」が入っていない場合の表現の仕方。 (2)上記の正規表現で、(¥S+)の数が、実際の入力ファイルのデータの個数(7個) aaaa bbbbb cccc dddd eeeee ffff ggggg と合っていなくても、動くのは、なぜ? (3)現状の出力ファイルにて、なぜ、2行目が空欄になるのか? (/NONE/!=text)で、処理を飛ばしたのだから、空白になるのは、おかしい?? 宜しくお願いいたします。
お礼
sakusaker7さん、ありがとうございます。 next if /NONE/ =~ text これを使って、うまく行きました。 皆様のお陰で、今回、目標とした、PerlをRubyで置き換えるステップは、無事完了しました。ありがとうございました。