• ベストアンサー

正規表現でファイル名の抽出

社内の掲示板に属するWebアプリケーションを制作しております。 複数のファイルをアップロードするために、<input type="file" ...> で得たファイルのパスを一時的にリストに表示させる仕様になりました。 そこで、javascriptの正規表現オブジェクトで次のようなフルパスから ファイル名のみを抽出することを考えました。  a: c:\hoge.txt  b: \\foo_server\foo_dir\hoge2.txt a,bから、それぞれ hoge.txt hoge2.txt を得るために、/[^\\].*/によって \\を取り除いた後で/\\.*\..*$/ によって欲しい文字列が得られると考えましたら文字列どころか何も 得られませんでした。 /[^\\].*/までは動いているようです。 オブジェクトの使い方が誤っていると考えているのですが、どの様に 扱えばよいのか皆目見当がつかなくなりました。 大変お手数ですが、ご教示願います。

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

  • ベストアンサー
回答No.6

なるほど、大体わかりました。失礼ですが、正規表現をあまり把握されていないようですね。 正規表現は便利な反面少し難しいので、なれないうちはBLUEPIXYさんのおっしゃるような原始的な方法でがんばるほうがいいかもしれませんよ。 しかしそれでは質問に答えたことにはならないので、とりあえず回答します。 まずこれ /[^\\].*/ これは、文字列の中から1文字目が\ではなくその後任意の文字が続くという意味です。そのため、この時点ですでにうまく動いていないはずだと思うんですけど…。 とりあえず私ならこうするよというソースを貼っておきます。これだけです。後ろから見て\以外の文字列のところだけ取る。簡単でしょ? myRE = /[^\\]*$/; result = fn.match(myRE); alert(result);

komorebi99
質問者

お礼

ご教示大変ありがとうございました。 業務上迫られjavascriptの参考書首っ引きでコードを書いております。 仰るとおり正規表現につきましては軽くどころかカナリヤバイ状態です。 これを機に頭に叩き込む所存です。

その他の回答 (5)

  • Hasty
  • ベストアンサー率73% (19/26)
回答No.5

<input type="file" ...>で選択したファイルのパスって、JavaScriptじゃ取得不可だったように記憶してるんですけど、取れるの確認しました? ちなみに、No.4の補足のスクリプトは、\\でなきゃいけないところが\になってるのがうまくいかない原因です。 ついでに、パスからファイル名の取り出しは、 var result = str1.split(/[\\\/]/).pop(); でもできますよ。これだとパス区切りが\でも/でもOKです。

komorebi99
質問者

お礼

ありがとうございます。 おかげさまで解決しました。 今後十分生かしていけるようにします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>「\」全てが削除されて文字列が連結した状態になります。 substrとlastIndexOfでそんな動作にはなりません。 ”「\」全てが削除されて” というのは、多分、matchによるものだと思います。 ごっちゃにされませんように・ あと、いまさらですが、ファイルの階層の区切りはwindowsでは「\」ですが、他のシステムではそうとは限りません。UNIXやmac

komorebi99
質問者

お礼

おかげさまで解決しました。 回答ありがとうございました。<m(__)m>

komorebi99
質問者

補足

度々の回答ありがとうございます。お手数おかけしております。 ごっちゃにはしておりません。試した上で補足質問させて頂いております。 下記のコードで試しましたが、私のwindows環境では連結してしまいます var str1 = "\\abcd\efgh\ijkl\mnop.txt"; var result = str1.substr(str1.lastIndexOf("\\")+1); alert(result); 上のコードはBLUEPIXY様の試されたコードとは違う結果になるという ことでしょうか。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>lastIndexOfでは「\」は検索できないようです。 いや、使えますって、 IEとFireFoxで確認しましたが大丈夫でした。 var fn = document.strdata.upfile1.value; var result=fn.substr(fn.lastIndexOf("\\")+1); でいけると思います

komorebi99
質問者

補足

検索できないと記述しましたが、動かしてみますと 「\」全てが削除されて文字列が連結した状態になります。 必要なデータは最後の\の右側の文字列のみです。 このような結果になりまして、検索できないのかな…と考えました。

回答No.2

まず、現状のソースを貼ってください。

komorebi99
質問者

補足

質問閲覧ありがとうございます。 var ele = document.createElement("option"); myRE = /[^\\].*/; var fn = strdata.upfile1.value; result = fn.match(myRE); myRE2 = /\..*$/; result2 = result.match(myRE2); ele.value = fn; var str = document.createTextNode(result2); どうもmyRE2でおかしくなっているようです。 「\」がちゃんと扱えているのかどうかが怪しいところです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

最後の「\」の後を取り出すなら filename.substr(filename.lastIndexOf("\\")+1) でいいと思います。

komorebi99
質問者

補足

回答ありがとうございます。 試してみましたが、lastIndexOfでは「\」は検索できないようです。 エラーとなりました。 lastIndexOfが使える代替文字などがあるのでしょうか。

関連するQ&A

専門家に質問してみよう