• ベストアンサー

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

社内の掲示板に属する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

  • awkの正規表現について

    ディレクトリ名とファイル名の一覧ファイルがあり、その中から特定ディレクトリの1階層下のディレクトリ名とファイル名を取得したいのですが、うまく抽出できません。 ディレクトリ名とファイル名の一覧ファイル(dir.txt)は /foo/ /foo/bar/ /foo/bar/a.txt /foo/bar/sub/ /foo/bar/sub/x.txt /foo/var/ /foo/var/b.txt /usr/ /usr/bar/ で「/foo/」指定すると /foo/ /foo/bar/ /foo/var/ を抽出し 「/foo/var/」を指定すると /foo/var/ /foo/var/b.txt を抽出したいです。 この場合、awk '$1 ~ /^\/foo\/bar\// {print}' dir.txtとすると /foo/bar/ /foo/bar/a.txt /foo/bar/sub/ /foo/bar/sub/x.txt が抽出されてしまいます。 どのような書き方をすれば1階層下のディレクトリとファイルのみを 抽出できるのでしょうか?

  • 正規表現

    テキストファイルからコメント行以外から文字列"bbb"を含む 行をgrepで抽出したいと思っております。 コメント行→"#"で始まる行と"--"で始まる行 先頭にスペースがある場合もあるので、結局 先頭に「0個以上のスペース+("#"or"--")」がある行は対象外 として、文字列"bbb"を含む行をgrepで抽出したいと思っています。 下記、foo.txtの中から下記の抽出対象の2行のみを抽出したい場合、 どういった正規表現を書けばいいか教えてください。 【foo.txt】 aaa bbb → 抽出対象 aaa bbb →抽出対象 # aaa # bbb →抽出対象外 #aaa # aaa --aaa --aaa -- aaa -- bbb →抽出対象外 -aaa -bbb - aaa ご存じの方がいらっしゃいましたら、よろしくお願い致します。

  • 正規表現を使って行数毎の数字を抽出したいです。

    正規表現を使って行数毎の数字を抽出したいです。 -ウェブに表示されている文字列--- 101 100 99 98 ...... -------------------- この表示が1行につき3文字固定であれば以下でできました。 (/(\d{3})/, '<a href="foo/\1">\1</a><br/>')

  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

  • awkでスラッシュがある動的変数の抽出について

    2つのテキストファイルがあり、directorylist.txtから1行取り出し、filelist.txtから対応するファイルを抽出したいのですが directorylist.txtに「/」があるため 「正規表現が終端されていません」というエラーがでます。 どのようにしたら、抽出できるのでしょうか? while read LINE; do awk ' $2 = '"$LINE"' { print $1 }' filelist.txt done < directorylist.txt ●filelist.txt [File名] [Directory名] a.txt /home/hoge/ del.txt /home/hoge/ b.txt /home/foo/ ●directorylist.txt [Directory名] / /home /home/hoge

  • 可変長コマンドとその中のファイル名を変数に格納するには?

    宜しくお願い致します。 可変長のコマンド(空白が可変個ある文字列)とそのコマンド文字列内のtxtファイル やdivファイルやpsファイルやtexファイル名(ひとコマンドにファイル名は1つだ け)を取り出し 変数に代入するスクリプトtest.shを考えています。 #!/bin/bash -x COMMAND= FILE= のイコールの右辺には何と記述すればいいのでしょうか? 具体的には $ ./test.sh hoge foo hoe.dvi hoehoe hogehoge … とした時(コマンド分の長さは可変) COMMANDに「hoge foo hoe.dvi hoehoe hogehoge …」という文字列、 FILEに「hoe.dvi」 を代入したいのです。

  • cshのsed

    ヤマトです。 cshのsedについて質問します。 環境はRed Had Linux7.2です。 文字列置換でsedを使っています。 置換文字列に'/'が入ってしまう場合正常に動作しません。 原因は分かります。'/'が多いって事ですよね(曖昧な言い方ですみません) どのようにしたら、できるでしょうか? 以下に、サンプルを書きます。 ====SAMPLE.sh(一部抜粋)==== set DATA_DIR = /home/hoge set FILE_NAME = hoge.txt sed "s/__DIR__/$DATA_DIR/g" < FILE_NAME > FILE_NAME.sed ====hoge.txt==== 置換した ディレクトリは __DIR__/です ====hoge.txt.sed(作成したいファイル)==== 置換した ディレクトリは /home/hoge/です どのようにsedしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • 正規表現による文字列の抽出

    $data = 'a b c<a href="x/y/z/hoge.jpg">hoge.jpg </a> …<A HREF = "aa/b/c/hoga.jpg">hoga.jpg</A>…'; 上記の文字列から正規表現で 『x/y/z/hoge.jpg』と『aa/b/c/hoga.jpg』を取り出して配列に格納しようと思っているのですがうまくいきません。 条件は 1.『<a href="』(大文字の場合、またはイコールの前後に半角スペースが含まれる場合もあります。)と『">』に囲まれています。 2.文字列中に何回登場するかは決まっておりません。 3.取り出す文字列の長さはきまっておりません。 以下のように書いてみたのですが…。書き方がわかりません。 どなたかご教授いただけないでしょうか。 よろしくお願いいたします。 while ($data =~ /<a\s[hH][rR][eE][fF].=.\".*?">/g){ push(@arr, $&); } foreach(@arr){print $_,"\n";}

    • ベストアンサー
    • Perl
  • 正規表現 URL

    過去ログを見ましたが 分からなかったので質問します。 $str = "hoge http://google.com foo http://yahoo.com one"; こんな感じの文字列から hoge http://google.com foo http://yahoo.com one を抜き出したいと思っています。 ちなみに URL と 単語 は可変で並び順もばらばらを想定しています。 こんなこと出来るのかわかりませんが よろしくお願いします。

    • ベストアンサー
    • PHP
  • grepコマンドの使い方

    下記のようなファイルがあるとします。 カレントディレクトリ /home から"hello"という文字列が含まれるテキストを grepしたい場合、コマンドはどのようにすればいいのでしょうか? 色々な方法があると思いますが、よろしくお願いします。 ---------------------------------------------------------------------- /home/hoge1/foo1.txt foo2.exe foo3.txt /home/hoge2/hogehoge2/foo4.txt foo5.exe /home/hoge3/hogehogehoge3/foo6.txt foo7.exe foo8.zip ----------------------------------------------------------------------