• ベストアンサー

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

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
質問者

補足

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