- ベストアンサー
正規表現について(最後にマッチした以降のデータ取得)
以下の文字列から、最後の「\」以降の文字列を取得する方法を 教えていただけますでしょうか。 D:\PROGRAM\ANALYZE\LAN\data0123.dat この文字列から、「data0123.dat」を取り出したい。 「data0123.dat」の部分は、拡張子含めていろいろ変わります。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
もっとスマートな式があるかもしれませんが my $S = 'D:\PROGRAM\ANALYZE\LAN\data0123.dat'; ## 正規表現 $S =~ m/.*\\([^\\]+)$/; print $1; ただし、ファイルパスを見るとDOS(Windows)環境のようですので環境はShift-JIS。 全角文字が混ざった場合には正規表現が正常動作する保障がありません。 正規表現の練習なら良いのですがこの程度の処理なら組み込み関数使った処理のほうが効率が良いと思います。 ## 組み込み関数 print substr($S,rindex($S,"\\")+1); ほかにも書き方はあります。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
正規表現なら m/.*\\(.+)$/; でいいはずです>#4. $' を使うなら m/.*\\/ でマッチさせる.
お礼
お礼遅くなりましたが、ご回答ありがとうございました。 今回は色々な手法を伝授いただき、大変助かりました。 今後ともよろしくお願いいたします。
- _--_--_-_-
- ベストアンサー率47% (8/17)
splitを使って、次のように書けます。 $path = 'D:\PROGRAM\ANALYZE\LAN\data0123.dat'; $dat = (split /\\/, $path)[- 1] $pathがご質問内容の文字列で、$datが取り出した部分です。 参考意見ということでよろしくお願い致します。
お礼
ご回答ありがとうごいざいます。 splitを使うという手もありましたね。 正規表現しか考えていませんでした。 参考にさせていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 と違う方針をいくつか: ・正規表現は最長一致であることを使うと [] は使わなくていい ・$' ・split
お礼
ご回答ありがとうございます。 以下コードで実現できましたが、正しくかつ効率的でしょうか? 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)
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 ヒント [ ] ^ 答えまるまるは ここの約束で 書いてあげられない
お礼
ヒントのご提示ありがとうごいざいます。 試行錯誤してみます。 またよろしくお願いいたします。
お礼
ご回答ありがとうございます。 スマートな書き方があるのですね。 print substr($S,rindex($S,"\\")+1); の手法は参考になりました。 rindexは使ったことが無かったので、試してみます。 ちなみに今回の使い方としては、Webツール(CGI)でWindowsから ファイル名称を読み取り、サーバ側でEUCコードに変換して処理を しています。(ファイルアップロード時のファイル名称を使って、 出力ファイル名称等を生成させています。)