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

Rubyを使って、テキスト処理をやっています。 どうしても、うまく行かないところがあります。 サジェスチョンをお願い...

guci-ok さんからの 回答

  • 2007/05/05 21:16
  • 回答No.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
------------------------
補足コメント
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
  • Rubyの構文?言語仕様? Ruby

    Rubyの以下コードについて質問です。 #!/ruby/bin/ruby print "content-type: text/html\r\n\r\n"; puts "Hello World!" begin def foo x =0 (0...10).each do |value| print value.to_s +"の時"+ x.to_s + "<br />" end end foo rescue =>e print e.class.to_s+ "<br />" print e.message end 上記コードを実行すると以下のような例外を取得します NoMethodError undefined method `+@' for "\343\201\256\346\231\202":String どうやら上記コードの print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが 上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを 入れるとうまく実行されます。 いったい原因はなんなのでしょうか? 細かい箇所ですが是非、ご教授ください。...

  • Rubyの正規表現を引数に その他(プログラミング・開発)

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

  • DBから抜き出した値を表示する方法 PHP

    FORMで入力された値をもとにデータベースから値を拾ってきて それを画面に表示させる、という処理をしたいと思っています。 具体的には、usersという「名前」と「ID」が格納されたテーブルがあり、 名前を入力するとその名前に紐付いたIDを表示させるというものです。 usersテーブルには、 id | name --------- 1 | abc 2 | def 3 | ghi というようなデータが入っています。 下記のように書いているのですが、 IDを拾ってきてくれません。 何を入力しても「あなたのIDはです」 と表示されます。 FORMで入力した値が"abc"なら 「あなたのIDは1です」と表示したいです。 echo $user_name; を実行すると入力した名前が出てくるので データベースから抜き出す処理がうまくいっていないと考えてます。 つたない文章になってしまい、 申し訳ありませんが、 お助けいただければと思います。 よろしくお願いいたします。 ------- <?php if ($_SERVER['REQUEST_METHOD']=="POST") { foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array); $con = mysql_connect('localhost', '【ユーザー名】', '【パスワード】'); if (!$con) { exit('DBに接続できませんでした。'); } $result = mysql_select_db('【データベース名】', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $db = mysql_query('SELECT * FROM users where name='.$user_name, $con); $db = mysql_fetch_array($db); $message="あなたのIDは".$db['id']."です"; echo $message; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language ?>" lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>テスト</title> </head> <body> <form action="<?= $_SERVER['PHP_SCRIPT']; ?>" method="post" accept-charset="UTF-8"> <b>名前:</b><br> <input type="text" name="user_name" value="" /> <br><br> <input type="submit" value="ID確認" />&nbsp;&nbsp;<INPUT type="reset" name="reset" value="リセット"> </form> </body> -------...

  • Rubyにおける、XPathの関数「text()="x"」への変数の使 Ruby

    Rubyにおける、XPathの関数「text()="x"」への変数の使用方法 お世話になります。 RubyにてXPathの関数「text()="x"」"x"の部分に変数を使用したいと思い、コードを作成しています。 text() 関数のところで困っています。 例えば <?xml version="1.0" encoding="UTF-16"?> <NameRoot> <Text> <Name>あああああ</Name> <No>001</No> </Text> <Text> <Name>いいいいい</Name> <No>002</No> </Text> <Text> <Name>ううううう</Name> <No>003</No> </Text> </NameRoot> の内容のファイルを読み込み、その中から該当するNoに相当するNameを取得しようと しています。 で、書いたのが下記のような内容なのですが、gettestクラスのgetNameメソッドにて コメントアウトしてある行であれば、決め打ちでNo="001"の物を取ってこれるのですが、 ここに引数として渡されたローカル変数の、idを使用しようとするとnode変数にNilClass が返ってきて取得できません。 文字列リテラルを色々調べてみたのですが、どうも上手く行かず困っています。 他愛も無い質問かもしれませんが、大変困っています。 どなたか知恵をお貸しくださいますようお願い致します。 class gettest def getName(id) #↓これがきちんと動きません node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="#{id}")]') #↓こちらは当然ながら動きます # node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="001"]') path = (node.xpath + "/../Name") @name = @masterdata.elements[path].text() end end class main def edit @mastername = "" @mastername = @master.getName("001") print @mastername end end...

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

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

ページ先頭へ