• ベストアンサー

perl 正規表現 抽出

perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように 書けばいいのかわかりません。 実現したいことは 「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」 というテキストに対して 「拡張子」のみを抽出することと 「ファイル名」のみを抽出することです。 パターンマッチや変換はなんとなくわかるのですが 抽出の仕方がよくわかりません。 よろしくお願いいたします。

  • Perl
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

File::Basenameを使うのがよいかと。 http://perldoc.perl.org/File/Basename.html もしかすると、cmd.exeでdirとforを使うか、Scripting.FileSystemObjects使うほうが楽かもしれない。

参考URL:
http://www.ideone.com/EAlSM
hi_mawa
質問者

補足

回答ありがとうございます。 さっそくFile::Basenameを使ってみました。 期待していた通りのものだったのですが、ひとつ気になる点がありました。 ファイル名に「構築」とい文字が入っていると、おかしなころで区切られてしまいます。 例えば C:/aaa/bbb/ccc/構築.docx このようなディレクトリ構成のファイルがあった場合 ディレクトリネームが C:/aaa/bbb/ccc/構 ファイルネームが   築 拡張子が       .docx となってしまいます。 原因がどこにあるのかさっぱりですが、ここは無視して利用しようかなと考えています。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

実験すればすぐにわかるのですが, File::Basename を使うと d:/hoge/hage/aaaaa というパスに対し ・ディレクトリ: d:/hoge/hage/ ・ファイル名: aaaaa ・サフィックス: (なし) という結果が得られます. #2 の補足を読むとこれではだめなような気もするんですが, どうなんでしょうか?

hi_mawa
質問者

補足

そのようになってしまうのですか。 拡張子のないファイルも想定していますが 拡張子付きのファイルのみを今後使っていこうと思います。 細かい補足までしていただき本当にありがとうございます!

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

> 原因がどこにあるのかさっぱりですが 文字コードに原因があって、 具体的にはEncodeモジュールで、cp932をutf8にしてやると良いです。

hi_mawa
質問者

お礼

utfに変換してやってみたら、しっかりと抽出ができました! 本当にありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

基本的には #1 で終わりなんだろうけど, 「拡張子」とか「ファイル名」とかっていったいなんだろうと思うと難しいところがあるんだよね.... 例えば, 以下のものに対してそれぞれどうなってほしいですか? a.b.c.d aaaaa .x

hi_mawa
質問者

補足

a.b.c.d に対しては、ファイル名がa.b.cの拡張子が.d aaaaa に対しては、ファイルではなくディレクトリ .x に対してはファイル名がなしの、拡張子が.xのファイル それぞれ上のように出力できるとよいと考えています。

関連するQ&A

  • Perlの正規表現で文字の抽出

    Perlを勉強しているのですが正規表現についてよくわからないので教えてください。 $text="【件名】本文" とあるときに、【】で囲まれた文字列(【】も含む)を抽出し、$textに戻したいのですがどうすればいいのでしょうか? ($textの中身を【件名】としたいのです) よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現の実行レポートは作成可能でしょうか?

    開発言語:Perl(Win32) ヴァージョン:5.8.4.810 perl.exeのプロパティー参照 長文の正規表現にパターンマッチを試みているのですが、 本来マッチするはずの文字列に対して、マッチしません。 しかし、正規表現が長文のため、なかなかデバッグが進みません。 どのように、パターンマッチが進んでいるか見ることが出来ればデバック作業が早くなると思うのですが、 私はその方法を知りません。 そこで、質問なのですが、Perlが正規表現をどのように解釈して、パターンマッチを進めているか、確認する方法はないのでしょうか? できれば、パターンマッチ実行中、解釈している位置と、文字列をレポートとして出力する方法があれば、それを知りたいと思います。

    • ベストアンサー
    • Perl
  • 抽出 正規表現 DOM?

    PHPの正規表現で、例えば <img src="画像ファイル名"...> のようにイメージタグのsrc部分の画像ファイル名を抽出させたいのですが、正規表現の記述の仕方がわかりません。 このようなイメージタグなのですが、imgがIMGだったり、src=画像ファイル名 のように""がなかったり、 alt, width, height, borderなど属性もありますので、正規表現で純粋に画像ファイル名を抽出するのは難しいと考えますが、ふと思ったのですが、DOM???を使えば簡単にできる?かなと思うだけでこれも実現方法がわかりません。 現在、PHP4.3を使っていますが可能でしょうか?

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

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

  • 正規表現について(Perl5準拠)

    HSPでプログラミングをしてるのですが、標準のHSPでは正規表現が使えないため、Perl5に準拠した正規表現が扱えるモジュールをインクルードして使っています。 正規表現初心者です。 プログラムのなかでファイのパスからファイル名だけにマッチするような正規表現を使いたいのですが上手くいきません。 具体的には c:円dir1円dir2円filename.xxxからfilename.xxxを抜き出すために ※円マークが質問に表示されないぬで「円」と書きました。 [^円]+$ という正規表現を考えました。意味は「円」以外の文字で始まる行末までの文字列という感じです。 「円」がメタ文字の為の記号だからダメなんでしょうか?自体を認識するためにはどのようにしたらいいのでしょうか? それとも正規表現がダメなんでしょうか? Perl5の場合でいいので、分かる方、教えてください。

  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlの正規表現

    Perlの正規表現である文字列に文字列STRINGが含まれないようにするには ^(?!.*STRING).+$ と書くとググったら出てきました. ですが,?!について詳しいことまで書いてるサイトはありませんでした. ?!は具体的にはどのようなことをするのでしょうか?

  • 正規表現でURLを抽出するには。

    正規表現でURLを抽出するには。 HTML内リンク先などのURLを正規表現で抽出したいのですが。 HTML内で表記されているURLはhttpやhttps以外にも相対URLなど様々な書き方が できるようですが、それらを抽出する正規表現パターンはどの様に書けばよいのでしょうか?

    • ベストアンサー
    • Perl
  • 正規表現のパターンに変数を指定したい

    perlでパターンマッチを行う際、正規表現で行いますが、パターン文字列内に変数を指定したい場合はどうすればよいのでしょうか? if ($ENV{HTTP_USER_AGENT} =~ /$pattern/) {  : } というようなことをしたいのですが、うまくいきません。 方法はありますでしょうか?

    • ベストアンサー
    • Perl
  • perlでの正規表現

    perl での正規表現がうまくいかないので質問させてください。 以下のような文章から「や」や「、」で連続に繋がった単語(カボチャ、人参、白菜、野菜)を抽出したいのですが これ|から|は|カボチャ|や|人参|、|白菜|など|の|野菜|が|旬|を|迎え|る|。 これ|から|は|カボチャ|、|人参|や|白菜|など|の|野菜|が|旬|を|迎え|る|。 自分なりに考えた以下のマッチではうまく行きませんでした。 m/(.*)\|[や、]\|(.+?)\|[や、]\|(.+?)\|など\|の\|(.+?)\|/; print "$2 $3 $4 $5\n"; 解決方法がありましたら、ご教示いただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう