• ベストアンサー

正規表現について(最後にマッチした以降のデータ取得)

以下の文字列から、最後の「\」以降の文字列を取得する方法を 教えていただけますでしょうか。 D:\PROGRAM\ANALYZE\LAN\data0123.dat この文字列から、「data0123.dat」を取り出したい。 「data0123.dat」の部分は、拡張子含めていろいろ変わります。 よろしくお願いいたします。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

もっとスマートな式があるかもしれませんが my $S = 'D:\PROGRAM\ANALYZE\LAN\data0123.dat'; ## 正規表現 $S =~ m/.*\\([^\\]+)$/; print $1; ただし、ファイルパスを見るとDOS(Windows)環境のようですので環境はShift-JIS。 全角文字が混ざった場合には正規表現が正常動作する保障がありません。 正規表現の練習なら良いのですがこの程度の処理なら組み込み関数使った処理のほうが効率が良いと思います。 ## 組み込み関数 print substr($S,rindex($S,"\\")+1); ほかにも書き方はあります。

keokada
質問者

お礼

ご回答ありがとうございます。 スマートな書き方があるのですね。 print substr($S,rindex($S,"\\")+1); の手法は参考になりました。 rindexは使ったことが無かったので、試してみます。 ちなみに今回の使い方としては、Webツール(CGI)でWindowsから ファイル名称を読み取り、サーバ側でEUCコードに変換して処理を しています。(ファイルアップロード時のファイル名称を使って、 出力ファイル名称等を生成させています。)

その他の回答 (4)

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

正規表現なら m/.*\\(.+)$/; でいいはずです>#4. $' を使うなら m/.*\\/ でマッチさせる.

keokada
質問者

お礼

お礼遅くなりましたが、ご回答ありがとうございました。 今回は色々な手法を伝授いただき、大変助かりました。 今後ともよろしくお願いいたします。

回答No.3

splitを使って、次のように書けます。 $path = 'D:\PROGRAM\ANALYZE\LAN\data0123.dat'; $dat = (split /\\/, $path)[- 1] $pathがご質問内容の文字列で、$datが取り出した部分です。 参考意見ということでよろしくお願い致します。

keokada
質問者

お礼

ご回答ありがとうごいざいます。 splitを使うという手もありましたね。 正規表現しか考えていませんでした。 参考にさせていただきます。

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

#1 と違う方針をいくつか: ・正規表現は最長一致であることを使うと [] は使わなくていい ・$' ・split

keokada
質問者

お礼

ご回答ありがとうございます。 以下コードで実現できましたが、正しくかつ効率的でしょうか? my $org_str = "D:\PROGRAM\ANALYZE\LAN\data0123.dat"; my $new_str; if($org_str =~ /\\\S+\\/){ $new_str = $'; } print $new_str; 結果: data0123.dat

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

http://www.google.co.jp/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%20%E5%85%A5%E9%96%80&hl=ja&lr=lang_ja ヒント [ ] ^ 答えまるまるは ここの約束で 書いてあげられない

keokada
質問者

お礼

ヒントのご提示ありがとうごいざいます。 試行錯誤してみます。 またよろしくお願いいたします。

関連するQ&A