Perl の正規表現についての質問です。


以下の数種類のパスがあります。

c:\aaaaa\000001\abc\index.html
d:\bbbb\ddd\test.txt
z:\共通\福岡\天神\メンタイコ\mentai.csv

上記の3種類のパスがあったとして、正規表現で直前のフォルダまでを取り出したいときはどうすればいいでしょうか?

欲しい結果は以下の通りです。

c:\aaaaa\000001\abc
d:\bbbb\ddd
z:\共通\福岡\天神\メンタイコ

このような結果が欲しい場合、正規表現でどのようにすればいいか、
知っている方、教えて下さい。

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:
  • 終了:2007/04/11 16:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント27pt
$path = 'z:\共通\福岡\天神\メンタイコ\mentai.csv' ;
$path =~ s/\\[^\\]*$// ;

こんな感じでは?

http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html

id:zachouR

ありがとうございます、さっそく組み込んでみます!

2007/04/04 16:35:57
id:n9d No.2

回答回数4ベストアンサー獲得回数0

ポイント27pt

http://q.hatena.ne.jp/

URLはダミーです。

最速であることに拘らないのなら、以下でよろしいのではないでしょうか。$1にセットされます。

'c:\aaaaa\000001\abc\index.html'=~/(^.+)\\[^\\]+$/

[コード]

foreach $i ('c:\aaaaa\000001\abc\index.html','d:\bbbb\ddd\test.txt','z:\共通\福岡\天神\メンタイコ\mentai.csv') {
    print $1,"\n" if $i=~/(^.+)\\[^\\]+$/
}

[実行結果]

c:\aaaaa\000001\abc
d:\bbbb\ddd
z:\共通\福岡\天神\メンタイコ
id:zachouR

ありがとうございました!

2007/04/04 21:19:31
id:Quphondi No.3

回答回数59ベストアンサー獲得回数2

ポイント26pt

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k05.htm

 Perl 文字列関数群 

厳密には正規表現ではありませんが、こういうやり方もあります。

$base = 'c:\aaaaa\000001\abc\index.html';

@parts = split(/\\/,$base); # \毎にバラバラにして配列に入れる

pop(@parts);  # 最後(ファイル名)を取り除く

$result = join("\\",@parts); # \で再連結

print "$base => $result\n";

ディレクトリ区切り記号はOS依存なので、/\\/ではなく/[\\\/]/の方がベターです。

id:zachouR

参考になります、こういうやり方もあったんですね、、、。

ありがとうございました。

2007/04/04 21:19:53
  • id:b-wind
    正規表現の練習ならいいんだけど、実際には
    http://search.cpan.org/dist/perl/lib/File/Basename.pm
    使ったほうがいいと思う。標準モジュールだし。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません