• ベストアンサー

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

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

  • Perl
  • 回答数5
  • ありがとう数6

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

  • ベストアンサー
  • 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

  • 正規表現:文字列の最後にマッチした文字以外を取得

    phpを使って、正規表現と関数で文字列の編集を行っているのですが いい方法が思いつきません。 やりたいことは以下のようなことです。 $find ="\n"//マッチさせたい文字 $string = "リンゴ、空、\nミルク、車\n";//検索対象 $str=関数($string);//わからない部分 print($str); ↓表示結果 リンゴ、空、\nミルク、車 文字列のインデックスの0から、最後にマッチした文字列の直前までを取得するにはどうしたらよいでしょうか。 またこのような表現には何か名前がついていますか? ご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現:  (111)-(222)-(333)

    正規表現:  (111)-(222)-(333) から (333)を取得したいと考えています。 ()で囲まれた数字のうち、最後のものを取得するというもので、 この、最後のという考えを実装することができずに困っています。 なぜ最後にこだわるかというと、以下のような例があるからです。 ◆ (111)english(222) ◆ (111)日本語(222)日本語 文字列中に含まれる()で囲まれた数字のうち、最後のものを取得する正規表現を教えてください。

  • 正規表現での$1や$2の使用方法

    正規表現の置き換え文字列部分で使用できる$1や$2の使用方法を教えてください! 以下のソース1のようにs///gの置き換え文字列部分に$1や$2を直接記述すれば、1つ目と2つ目のマッチ部分で置換が行われるのは確認しました。 しかし、ソース2のように置き換え文字列部分を変数に代入したのち、使用すると、正しく置換が行われません。 $1や$2を含んだ置き換え文字列を変数に持っている状態で、ソース1と同じ結果を得るにはどうしたらよいか、ご存知でしたら教えて下さい。 ############################## # ソース1 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $data =~ s/$ptn/$1-$2/g; ############################## ↓ $dataは123-4567となる。 ############################## # ソース2 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $str = "$1-$2"; $data =~ s/$ptn/$str/g; ############################## ↓ $dataは-となる。

    • ベストアンサー
    • Perl
  • grepにマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • 正規表現でつまずいています

    お世話になっております。 VB2005を使っていますが、正規表現でつまずいています。 日付を表すデータとして、以下のような2つのパターンがあります。 Date: 02-apr-2010   ← : と 02の間に半角スペースがあります。 Date:13-Jan-2010 00:12:14 それぞれから年月日のデータのみを取り出すために正規表現を組んでみましたがうまくいきません。 "Date:\s*(?<date>.*)$|\s.*" $|\s.*  で意図したところは、文字列の最後 or スペースが1個と任意の文字が続く、というものです。 正しい表記方法をご指示いただければ幸いです。 よろしくお願いいたします。

  • 正規表現について

    php5を使って正規表現を勉強中です。 1度の正規表現で、拡張子を除いた ファイル名だけ抜き出すにはどうしたらよいでしょうか。 例えば、以下のような文字列から、…以降のファイル名を抜き出したいです。 /var/www/html/index.html  …indexを抜き出したい /var/www/html/login/login.php …loginを抜き出したい /var/www/html/js/script.js …scriptを抜き出したい

    • 締切済み
    • PHP
  • matchの中の正規表現の記載について教えて下さい。

    matchの中の正規表現の記載について教えて下さい。 文字列の最後に「,」「.」があった時にこれを削除するために下記のようにプログラミングしてみました。 上手い方法を思いつかなかったので、最後に「,」があったときに「del」を文字列の最後に足して、replaceを用いて削除することをにしました。 削除したい文字を、一つずつ書いて削除させることは出来たのですが、まとめて配列化して下記のようにしてみたのですが、エラーが出てしまいました。また、削除したい文字はたくさんあるため、配列化もしくはそれに近いことが出来る必要があります。 正しくはどのように記載するのでしょうか? また、文字列最後の指定した文字だけを削除するもっとスマートな方法がありましたら、教えていただけないでしょうか。よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー var t2 = "KJANN B CVA,"; delw = new Array("," , "."); for (i=0; delw[i]; i++){ if (t2.match(/delw[i]$/)){ t2 += 'del'; t2 = t2.replace(",del",""); } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • Perl正規表現(置換)

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

    • ベストアンサー
    • Perl
  • 正規表現に関して

    指定のファイルがない、あるいは、指定ファイル内に「abc」という文字列が含まれていない場合には、そのファイルに「abcd」という文字列を保存したいのですが、(例えば下記のように)色々と試したのですが、上手く動作しませんでした。私の考え方か記述方法に間違いがあると思うのですが、正しい記述方法をご教授いただけないでしょうか。恐れ入りますが、よろしくお願いいたします。 ###ファイルからデータを取り出す $fileA="data.dat"; #ファイル名の指定。 open(FILEA, "$fileA"); #ファイルを開く @allbodyA = <FILEA>; #ファイル内のデータを配列に close(FILEA); #ファイルを閉じる $tmpA=@allbody; #配列のデータを変数に ###文字列検索による分岐 unless($tmpA=~ /abc/){ #「abc」が含まれているか確認してるつもりです $tmpA="abcd"; #(含まれてないときはファイルに「abcd」を保存したい。) @allbodyA=$tmpA; #print "作成成功"; ###ファイルにデータを保存 open(FILEA, ">$fileA"); #ファイルを開く print FILEA @allbodyA; #ファイルに配列「abc」を close(FILEA); #ファイルを閉じる } 申し訳ございませんが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現の書き方が分かりません

    atesttestの様にに続いている文字列から最後のtestだけ取り出す正規表現の書き方が分かりません。 一応この文字列は「ふぁぇいじょatestえあいふぉあいじぇふぉtestだふぉえいふぉあじょあいふぇお」みたいな文字列に入っているんですけどatestのtestは抜き出さずtestだけ抜き出す方法は有りませんか

専門家に質問してみよう