• ベストアンサー

正規表現を教えて下さい(挫折)

お世話になります。 javaの正規表現でディレクトリパスを変更したいのですが、正規表現が分からないので教えて下さい。 色々試しましたが挫折しました。 やりたいのは ./path/filename ../../path/filename /../../path/filename という感じのディレクトリ名を全て/path/filenameにしたいのです。 余計な../というところを取りたい。 ../が一つとか決まっていてばできたのですが、回数が分からない場合にどうしたら良いかわかりませんでした。 よろしくお願いします。

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

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

> ./path/filename > ../../path/filename > /../../path/filename > という感じのディレクトリ名を全て/path/filenameにしたいのです。 「余計な../を取りたい」と言いながら 上記の例では先頭の「./」や「/」も削除していて、 どうしたいのかよくわかりません。 「//」や「...」等の不正パターン含めて 単純に先頭の/や.を削除したいというだけなら、 ^[\.\/]+ でマッチした部分を「/」に置換すればよいと思います。 「..」や「.」を含むパス表現を同じパスを意味する絶対パス表現に 変換したいということなら、「../」の部分を単純削除すれば よいというものではありませんので、他の方も言われている通り、 getAbsolutePath()メソッドで変換する必要があると思います。

miruha2011
質問者

お礼

ご回答ありがとうございます。 No4で補足を追加させて頂きますのでよろしくお願いします。

miruha2011
質問者

補足

皆様ご回答ありがとうございます。 試行錯誤していたため、ほとんど意図が伝わらない質問で失礼しました。 本当は何をしたいのかというと、Stringに設定された文字列の中から、ディレクトリ名に相当する部分を整形したかったのです。 整形のパターンは二通りあって、 A)./../../path/filenameの前にある「./」「../」を取り除く B) ./../../path1/path2/filenameの前にある「./」「../」と/path1を取り除く(/path2/filenameにする) です。 BはAのやり方が分かれば何とかなるかなと思いAを質問しました。 javaの正規表現を使えばできるというで試したのですが、具体的なコードにする際、ピリオドやスラッシュのエスケープとか繰り返しの指定方法とかがゴチャゴチャしてきて挫折しました。 String str ="あああ ../../path/filename ../../path/filename xxxx" を String str ="あああ /path/filename /path/filename xxxx" に置き換える具体的なコードを教えて頂けないでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.5

$の意味わかってます? 「最後」ってことです。 "/"で終わる文字列なんかないじゃないですか。 "../"が続くところを差し替えるなら以下です。 "(\\.\\./)+image"を"/IMAGE"に替えるようにして下さい。 間違っても^や$は出てきません。

miruha2011
質問者

お礼

ご回答ありがとうございます。 これでうまくいきました。 ---- プログラム --------------------------------------- // 変換する元の文字列 String str = "<a href=\"../../image/aaa/image1.jpeg\">イメージ1</a>\n"; // String str = "<a href=\"../image/aaa/image1.jpeg\">イメージ1</a>\n" // + "<a href=\"../../image/bbb/image2.jpeg\">イメージ2</a>\n" // + "<a href=\"../../../image/ccc/image3.jpeg\">イメージ3</a>"; System.out.println("\n変更前 = \n" + str); // 先頭とみなすキーワード ※・・・/image/ を /IMAGE/にしたい String path = "image"; // String reg = "(\\.\\./)+" + path + "/(.*)$"; // String reg = "[\\.\\/]+" + path + "/$"; String reg = "[\\.\\/]+" + path + "/(.*)$"; System.out.println("\nreg = " + reg); Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); String result = m.replaceAll("/IMAGE/$1"); System.out.println("\n変更後 = \n" + result); ---- 実行結果 --------------------------------------- 変更前 = <a href="../.././../image/aaa/image1.jpeg">イメージ1</a> reg = [\.\/]+image/(.*)$ 変更後 = <a href="/IMAGE/aaa/image1.jpeg">イメージ1</a>

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.4

論理的に考えると、「文字列の最後の"/path/filename"を残す」 となります。単にやるなら以下の通りです。 "/path/filename$" この"path"や"filename"が文字通りでない時は次のように考えます。 「後方から"/"でない文字が続き、"/"のあとまた"/"でない文字が続き、 次の"/"まで」 これを表すと、"/[^/]+/[^/]+$"になります。

miruha2011
質問者

お礼

ご回答ありがとうございます。 補足を追加させて頂きましたのでアドバイスをお願いします。

miruha2011
質問者

補足

根本的に間違っているかも知れませんが今のコードを記載します。(テスト用に書き直したコードですので説明した内容と微妙に違っている部分はご容赦下さい) ---- プログラム --------------------------------------- // 変換する元の文字列 String str = "<a href=\"../image/aaa/image1.jpeg\">イメージ1</a>\n" + "<a href=\"../../image/bbb/image2.jpeg\">イメージ2</a>\n" + "<a href=\"../../../image/ccc/image3.jpeg\">イメージ3</a>"; System.out.println("\n変更前 = \n" + str); // 先頭とみなすキーワード ※・・・/image/ を /IMAGE/にしたい String path = "image"; // String reg = "(\\.\\./)+" + path + "/(.*)$"; // String reg = "[\\.\\/]+" + path + "/$"; String reg = "[\\\\.\\\\/]+" + path + "/$"; System.out.println("\nreg = " + reg); Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); String result = m.replaceAll("IMAGE"); System.out.println("\n変更後 = \n" + result); ---- 期待する結果 --------------------------------------- <a href="/IMAGE/aaa/image1.jpeg">イメージ1</a> <a href="/IMAGE/bbb/image2.jpeg">イメージ2</a> <a href="/IMAGE/ccc/image3.jpeg">イメージ3</a> ---- 実行結果 --------------------------------------- 変更前 = <a href="../image/aaa/image1.jpeg">イメージ1</a> <a href="../../image/bbb/image2.jpeg">イメージ2</a> <a href="../../../image/ccc/image3.jpeg">イメージ3</a> reg = [\\.\\/]+image/$ 変更後 = <a href="../image/aaa/image1.jpeg">イメージ1</a> <a href="../../image/bbb/image2.jpeg">イメージ2</a> <a href="../../../image/ccc/image3.jpeg">イメージ3</a>

すると、全ての回答が全文表示されます。
  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

ディレクトリのパスなら FileクラスのgetAbsolutePath()メソッドを使えば良いのでは。

miruha2011
質問者

お礼

ご回答ありがとうございます。 質問の仕方が悪かったのですが、文字列の操作をしたいのです。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

文字通りに回答すると、(\.\./)+ ですが、 ./path/filename ../../path/filename /../../path/filename これらそれぞれは別物だし、 /path/filename これもまた別物ですが、それを同一視していいのでしょうか?

miruha2011
質問者

お礼

ご回答ありがとうございます。 全て同一視したいのです。

すると、全ての回答が全文表示されます。

関連するQ&A