• ベストアンサー

正規表現を教えてください。

YYYYMMDD_aa._aa_bbb.txt とあったとき YYYYMMDDは日付をあらわし, aa._aaはサーバ名をあらわして bbb.txtはファイル名をあらわすとき YYYYMMDD aa._aa bbb 値は変化するものでYYYYMMDD_サーバ名_fail.txtは変わらないとした時 それぞれあらわすperlでの正規表現を教えてください。

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

  • ベストアンサー
  • Kaone
  • ベストアンサー率60% (33/55)
回答No.3

であれば、最低の条件として、以下の条件を設定した場合の前提たと 条件 ※ファイルの拡張子は、必ず .txtで終わるものとする。 ※日付は、数字の組み合わせである ※bbbのファイル名には_(アンダーバー)は使用しないものとする。 ※日付、サーバ名、ファイル名の各セパレータは、_(アンダーバー)とする)が、サーバ名には_(アンダーバー)は、使用できるものとする。 ※各パラメータの文字数は可変長のものとする。 ($strdate,$servername,$fname) = /^(\d*)_(.*)_([^_]*)\.txt$/; 上記条件だと上のようになります。 例 #!/usr/bin/perl $_= "20060709_server_.name_filena.txt"; ($strdate,$servername,$fname) = /^(\d*)_(.*)_([^_]*)\.txt$/; print "1=$strdate\n"; print "2=$servername\n"; print "3=$fname\n"; 正規表現は、一定の規則のあるものを調べたり、置き換えたりするものなので、規則がないと、出来ません。 たとえば、ファイル名にアンダーバーが使用されてしまうと、サーバー名にもつかえるのでどこで区切ったらいいのか目で見てもわかりませんので最低限このような条件が設定されていないと、正規表現では表現できません。

orange_re
質問者

お礼

丁寧な回答ありがとうございます。

その他の回答 (3)

noname#79209
noname#79209
回答No.4

直接の回答ではありませんが、 何かのテキストファイル上の文字列を分割されたいようですが、 そのテキストファイルを生成する過程で、「日付」「サーバー名」「ファル名」をつなげる際に セパレータとして使う文字をアンダーバー以外の文字にすることは不可能なのですか? ご質問のような状況では往々にして、システムの下流側であれこれ悩むより、上流を直してしまった方がよいことがあります。 さらには、下流側のシステムがどんどん複雑、イビツになっていく恐れもあります。

  • Kaone
  • ベストアンサー率60% (33/55)
回答No.2

サーバ名の規則とかはありますか? 例えば._は必ず使うとか ファイル名の種類とか たとえば    ファイル名は、ok.txtか fail.txtとかきまってるとか

orange_re
質問者

補足

決まりはないです・・・

  • Kaone
  • ベストアンサー率60% (33/55)
回答No.1

($strdate, $servname, $fname) = /(\d*)_(......)_(...)\.txt/; サーバ名とファイル名は固定長ですか? なら上の式で抽出できると思います。 普通は、/(\d*)_([a-zA-Z0-9]*)_([a-zA-Z0-9]*)\.txt/ とかするんですが、サーバ名にドットとアンダーバーが入ってるので、抽出しにくいですね。 そういう時は、任意の文字として、固定長で抽出します。

orange_re
質問者

補足

回答ありがとうございます。 サーバ名とファイル名は固定長ではないです。 その場合はどうしたいいかわかりますか?

関連するQ&A

  • 正規表現教えてください。

    正規表現を教えてください。 YYYYMMDD_aa._aa_bbb.txt とあったとき YYYYMMDDは日付をあらわし, aa._aaはサーバ名をあらわして bbb.txtはファイル名をあらわすとき YYYYMMDD aa._aa bbb 値は変化するものでYYYYMMDD_サーバ名_fail.txtは変わらないとした時 それぞれをあらわすperlでの正規表現を教えてください。 まとめてあらわすのではなく、ひとつずつを表す方法でお願いします。

  • 正規表現ですが・・・

    正規表現なんですが(Perlです。) Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt Bb_abcd.txt 上記のabcdの部分をマッチさせるために (?<=Aa_|Bb_).*(?=_aa|_bb|_cc|\.txt) としてみましたが、これでは Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt のabcd_aaやabcd_bbやabcd_ccとマッチしてしまいます。 なにかよい表現の仕方はありますか? まとめてマッチさせる表現が知りたいです。

  • 正規表現でどちらかに該当させる

    こんばんわ。 正規表現で、どちらかに該当するものだけを出力させるように したいと考えています。 20050901 20051023 20051011 20051121 20051207 というyyyymmdd形式の日付名のファイルがあったとして、 200509月分と10月分全てのファイルをピックアップするにはどのように書けばよいのでしょうか?

  • 正規表現について

    以下のようなファイル名にマッチする正規表現は [ファイル名] 20080303_001test.txt 20080303_002test.txt [正規表現] ^20080303_(001|002)test\.txt$ であってますでしょうか。 ※特に()内の、"001"と"002)test\.txt"のどちらかにマッチすれば良いという条件になってないか心配です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現について

    正規表現について勉強しているのですが、 $aaa = "http://あいうえお.こむ/"; $bbb = "http://www.あいうえお.こむ/"; $ccc = "あいうえお.こむ/"; 同じドメイン名ですが、それぞれ変数に入っている値は違います。 これらのドメイン部分を取り出す正規表現はどのようになるのでしょうか。

    • 締切済み
    • PHP
  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl
  • perlでの正規表現について教えてください。

    たとえば、 $A = 'aaa/bbb/ccc/ddd/eee/fff/ggg' というものがあったときにperlの正規表現でddd/のすぐ後の部分を抜き取って違う変数に入れたいのですが、それを正規表現で切り取りたいのですが、どうしたらいいかわからないです。 初歩的な質問ですが、お答えいただければ幸いです。 よろしくお願いします。

  • 正規表現

    テキストファイルからコメント行以外から文字列"bbb"を含む 行をgrepで抽出したいと思っております。 コメント行→"#"で始まる行と"--"で始まる行 先頭にスペースがある場合もあるので、結局 先頭に「0個以上のスペース+("#"or"--")」がある行は対象外 として、文字列"bbb"を含む行をgrepで抽出したいと思っています。 下記、foo.txtの中から下記の抽出対象の2行のみを抽出したい場合、 どういった正規表現を書けばいいか教えてください。 【foo.txt】 aaa bbb → 抽出対象 aaa bbb →抽出対象 # aaa # bbb →抽出対象外 #aaa # aaa --aaa --aaa -- aaa -- bbb →抽出対象外 -aaa -bbb - aaa ご存じの方がいらっしゃいましたら、よろしくお願い致します。

  • perlの正規表現について

    perl初心者です。 早速ですが質問です。 複数のファイルが存在するフォルダ内にて、「~.abc.txt」というテキストファイルのみを 読み込みたい場合はどのように指定すればよいのでしょうか。 #open (F,○○)という表記になるかと思うのですが、 #適当な正規表現が分からず苦労しております。 お分かりになる方いらっしゃいましたら、ご教授してくださいませ。 以上です。 宜しくお願いいたします。

  • 正規表現について2

    すみません、前回「正規表現について」でお世話になりました者です。 前回の分は解決したのですが、それに関連してもう少し教えてください。 data.txt---------------------------------------- aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ test.pl----------------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); my $line=0; open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/;} s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ------------------------------------------------ とすることで、得られたい結果である、 output.txt-------------------------------------- bbb aaadddccc aaaeeeccc ------------------------------------------------ IEでの表示-------------------------------------- bbb ------------------------------------------------ となりました。そこで今回教えていただきたいのは、 data.txt---------------------------------------- <空行> aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ というようにdata.txtのはじめが空行の場合にも、 上記と同じような結果を得たいです。output.txtの はじめは空行になっても構いません。得られる文字として、上と同じ結果がほしいです。どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl