• ベストアンサー

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

guci-okの回答

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

動作するソースを出して下さい。 以下の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 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)で、処理を飛ばしたのだから、空白になるのは、おかしい?? 宜しくお願いいたします。

関連するQ&A

  • Rubyの正規表現を引数に

    お世話になっています。 Rubyの正規表現を引数にできないものでしょうか? def chkStr(sReg) #正規表現にかける if regexp = sReg      ・・・ end end sReg = ~ /\t(国語|数学)/ chkStr(sReg) みたいなことがしたいのです。 宜しくお願いします。

  • 「マッチしない」正規表現の書き方

    正規表現について、おたずねします。 文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。 それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか? あちこち調べましたが、どうしてもわかりません。 ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

  • ruby 配列の中の正規表現は比較に使える?

    数万行あるテキストファイルの中を数百パターンくらいの正規表現で サーチするRubyスクリプトを作成しようとしていますがうまくできません。 どなたかお知恵を拝借させてください。 以下の流れで作ろうとしています。 「 ファイルを一行GETして、その行が事前に定義した配列内の正規表現に合致していればprintする。 次の行をGETして、最初からた正規表現の配列を比較して、合致していればprintする。 テキストファイルが終わるまで、繰り返し 」 何分初心者なもので…、他のやり方があれば教えていただきたいです… ヨロシクお願いしますm(__)m

    • ベストアンサー
    • Ruby
  • 秀丸の検索・置換の正規表現の最短一致の挙動が変です

    秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz の先頭にカーソルを置いた状態で、 (質問1) 正規表現のチェックボックスをチェックして /.*$ で検索すると /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (/abc/.*$とするとカーソルがある /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz ではなく次の行以降の /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます?) (質問2) 正規表現のチェックボックスをチェックして /.*?$ で検索すると最短一致となるため /uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (なお、/[^/]*$では/uvw.xyzが検索されます)

  • 正規表現の仕様について

    "abcdefg"という文字列に対して、/a(bc|bcd)/ という正規表現で検索すると 秀丸エディタの正規表現検索では、"abcd"がマッチし、 スクリプト言語のrubyでは"abc"がマッチします。 これは使用している正規表現ライブラリで演算子'|'の評価の仕方が異なるのだと思うのですが、統一された仕様のようなものは存在しないのでしょうか? 他の正規表現ライブラリ間でもこのような細かな動作の違いというのは存在するのでしょうか?

  • 秀丸の正規表現(HMJRE.DLL V1.92)で、

    秀丸の正規表現(HMJRE.DLL V1.92)で、 以下のことが可能かどうか教えてください。 ある2つの文字列のいずれも含まない行を 正規表現とGREPで抽出したいのです。 (ほかの手段でもかまいません) たとえば AAAA ABCDEF BCDEFG EFGHI といったテキストデータがあった場合 "ABC"と"DEF"のいずれも含まない行であれば AAAA EFGHI を抽出したいのです。 以上、よろしくお願いします。

  • 複数行をヒットさせる正規表現

    ~ 省略 ~ ==abc== ! ああ !: あいうえお ! いい !: いうえおあ ==def== ~ 省略 ~ とあった時、==abc==から==def==の間を全て取得したいのですが、 どうにも改行文字の所で止まってしまい、==abc==までしか 取得する事が出来ません。 ~ 省略 ~部分は全く同じ形式で文字列が大量にありますが、 ==abc==、==def==は1箇所にしか存在しません。 どういう正規表現をすれば上記全ての文字列を取得する事が出来るのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現で

    正規表現で、英大文字と記号だけからなる文字列、を表すにはどうすればよいでしょうか。言い方を変えると、とにかく英小文字は含まないという事なんですが… [^a-z]+ かなと思ったのですがダメでした。 123#ABC : OK 123#aBC : NG みたいな感じです。 よろしくお願いします。

  • 正規表現で先頭の一文字を消したい

    カレントのファイルリストを作りたいのですが、 どうすればいいかわかりません。 find . -type f > list.txt のようにしたのですが、 これだと ./abc/def/grt.txt のようになり、この先頭の"."が邪魔です。 正規表現を使えばいいのかと思ったのですが、 よくわかりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現が解読できません。

    ツールが対象ファイルを認識する規則が正規表現で記載されているのですが、 正規表現について無知なため、解読することができずに困っております。 ネット等で検索し、[A-Z0-9]や{4,4}など部分的には解読することができたのですが・・・ FILE_COPY.REGEX1=<ABC>\t.+\\\\ABC(\\\\.*)?\\\\[A-Z0-9]{4,4}[0-9]{3,3}[A-Z0-9]+\\\\[A-Z0-9]{4,4}[0-9]{3,3}[A-Z0-9]+\\.gz FILE_COPY.REGEX2=<DEF>\t.*\\\\[^\\\\]*(?<\!\\.tar) FILE_COPY.REGEX3=<GHI>\t.+\\.xml\\.gz どなたかお時間のある方がいらっしゃいましたら、ご教示いただけないでしょうか。 どうぞよろしくお願いいたします。