- ベストアンサー
perl 正規表現 抽出
perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように 書けばいいのかわかりません。 実現したいことは 「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」 というテキストに対して 「拡張子」のみを抽出することと 「ファイル名」のみを抽出することです。 パターンマッチや変換はなんとなくわかるのですが 抽出の仕方がよくわかりません。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
File::Basenameを使うのがよいかと。 http://perldoc.perl.org/File/Basename.html もしかすると、cmd.exeでdirとforを使うか、Scripting.FileSystemObjects使うほうが楽かもしれない。
- 参考URL:
- http://www.ideone.com/EAlSM
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
実験すればすぐにわかるのですが, File::Basename を使うと d:/hoge/hage/aaaaa というパスに対し ・ディレクトリ: d:/hoge/hage/ ・ファイル名: aaaaa ・サフィックス: (なし) という結果が得られます. #2 の補足を読むとこれではだめなような気もするんですが, どうなんでしょうか?
補足
そのようになってしまうのですか。 拡張子のないファイルも想定していますが 拡張子付きのファイルのみを今後使っていこうと思います。 細かい補足までしていただき本当にありがとうございます!
- kuroizell
- ベストアンサー率55% (95/170)
> 原因がどこにあるのかさっぱりですが 文字コードに原因があって、 具体的にはEncodeモジュールで、cp932をutf8にしてやると良いです。
お礼
utfに変換してやってみたら、しっかりと抽出ができました! 本当にありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
基本的には #1 で終わりなんだろうけど, 「拡張子」とか「ファイル名」とかっていったいなんだろうと思うと難しいところがあるんだよね.... 例えば, 以下のものに対してそれぞれどうなってほしいですか? a.b.c.d aaaaa .x
補足
a.b.c.d に対しては、ファイル名がa.b.cの拡張子が.d aaaaa に対しては、ファイルではなくディレクトリ .x に対してはファイル名がなしの、拡張子が.xのファイル それぞれ上のように出力できるとよいと考えています。
補足
回答ありがとうございます。 さっそくFile::Basenameを使ってみました。 期待していた通りのものだったのですが、ひとつ気になる点がありました。 ファイル名に「構築」とい文字が入っていると、おかしなころで区切られてしまいます。 例えば C:/aaa/bbb/ccc/構築.docx このようなディレクトリ構成のファイルがあった場合 ディレクトリネームが C:/aaa/bbb/ccc/構 ファイルネームが 築 拡張子が .docx となってしまいます。 原因がどこにあるのかさっぱりですが、ここは無視して利用しようかなと考えています。