• ベストアンサー
  • すぐに回答を!

Rubyにおける正規表現(一致しない)

  • 質問No.2975780
  • 閲覧数858
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0
Rubyを使って、テキスト処理をやっています。
どうしても、うまく行かないところがあります。
サジェスチョンをお願いします。
正規表現にて、
2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。
1行の内容は、textに入っています。

if (myFlag1==1) && (myFlag2==1) && (!/abcdef/) then
xxxxxxxx
end

(!/abcdef/)は、perlでの表現です。Rubyでは、少なくとも
(!/abcdef/=~text)
かな、と考えましたが、ダメでした。
(/abcdef/!=text)
でも、だめでした。

宜しくお願いいたします。

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

  • 回答No.2
  • ベストアンサー

ベストアンサー率 62% (800/1280)

> 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

のように分けた方がスッキリしてわかりやすくなると思います。
お礼コメント
noname#95859
sakusaker7さん、ありがとうございます。
next if /NONE/ =~ text
これを使って、うまく行きました。

皆様のお陰で、今回、目標とした、PerlをRubyで置き換えるステップは、無事完了しました。ありがとうございました。
投稿日時:2007/05/06 13:55

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 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
------------------------
補足コメント
noname#95859
guci-okさん、ありがとうございます。

小生の現状を正確に記述します。

入力ファイル(名称:test.log)
aaaa bbbbb cccc dddd eeeee ffff ggggg
NONE
NONENONExxxx

期待する出力ファイル(名称: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

NONENONExxxx

---------------------
2行目のNONEが出ていないのは、(/NONE/!=text)で抑えているから、当たり前ですが、
3行目の”NONENONExxxx”が出ているのは、困ります。

パターンとして、NONEと言う文字列が入っている場合には、処理を飛ばしたいのです。

-------------------
ここで、改めて、問題点は、
(1)その行のなかに、「あるパターンの文字列」が入っていない場合の表現の仕方。
(2)上記の正規表現で、(¥S+)の数が、実際の入力ファイルのデータの個数(7個)
aaaa bbbbb cccc dddd eeeee ffff ggggg
と合っていなくても、動くのは、なぜ?
(3)現状の出力ファイルにて、なぜ、2行目が空欄になるのか?
(/NONE/!=text)で、処理を飛ばしたのだから、空白になるのは、おかしい??

宜しくお願いいたします。
投稿日時:2007/05/05 22:21
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ