アプリ版:「スタンプのみでお礼する」機能のリリースについて

Rubyを使って、テキスト処理をやっています。
どうしても、うまく行かないところがあります。
サジェスチョンをお願いします。
正規表現にて、
2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。
1行の内容は、textに入っています。

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

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

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

A 回答 (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

のように分けた方がスッキリしてわかりやすくなると思います。
    • good
    • 0
この回答へのお礼

sakusaker7さん、ありがとうございます。
next if /NONE/ =~ text
これを使って、うまく行きました。

皆様のお陰で、今回、目標とした、PerlをRubyで置き換えるステップは、無事完了しました。ありがとうございました。

お礼日時:2007/05/06 13:55

動作するソースを出して下さい。



以下の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
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!