質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

8940閲覧

正規表現でN番目の「/」から末尾までの文字列を置換する方法

syachiku

総合スコア117

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/04/24 06:32

編集2019/04/24 06:57

下記のようなURLのコンテキストルートより後の文字列を置換したいです。

パターン1 置換前 http://localhost:8080/コンテキストルート/XXXXX/YYYYY 置換後 http://localhost:8080/コンテキストルート/AAAAA/BBBBB
パターン2 置換前 http://sample.com/コンテキストルート/XXXXX/YYYYY 置換後 http://sample.com/コンテキストルート/AAAAA/BBBBB

どのように正規表現を書けばいいですか?

調べてみて「^([^/]*/){4}」と記述してみたところ
http://localhost:8080/コンテキストルート/」の部分がマッチして惜しいところまできたのですが
うまく「/XXXXX/YYYYY」の部分のみをマッチさせることができませんでした。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/04/24 07:29

質問を書くときはJavaコードを提示しましょう。
jimbe

2019/04/24 14:17

どなたからも無いので一応ツッコミですけれど, 「"/XXXXX/YYYYY" を検索して "/AAAAA/BBBBB" に置換」とそのまま書けると思いますが, どうなのでしょう.
退会済みユーザー

退会済みユーザー

2019/04/24 22:43

サーブレットのコンテキストパスには "/" を含むことが可能ですが。
guest

回答2

0

残す部分にマッチできたのでしたら, 残す部分を取り出して, 置換するつもりだった文字列を追加すれば良いのではないでしょうか.

投稿2019/04/24 09:16

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

少し興味が有ったので書いてみました。
全体にマッチさせて、置換の際に後方参照を利用して残したい部分を引っ張り出しています。

Java

1import java.util.regex.Pattern; 2 3class Main { 4 public static void main(String[] args) { 5 String[] targets = { 6 "http://localhost:8080/コンテキストルート/XXXXX/YYYYY", 7 "http://sample.com/コンテキストルート/XXXXX/YYYYY", 8 }; 9 10 var pattern = Pattern.compile("^((?:.*?/){4}).+$"); 11 for(var target: targets) { 12 var dst = pattern.matcher(target).replaceFirst("$1AAAAA/BBBBB"); 13 System.out.println(dst); 14 } 15 } 16}

実行結果 Wandbox

plain

1http://localhost:8080/コンテキストルート/AAAAA/BBBBB 2http://sample.com/コンテキストルート/AAAAA/BBBBB

ベストな方法では無いかもしれません。悪しからず。


正規表現に拘らないのなら、/+でString#splitした方が楽な気がします。
あるいは何かしら頼れる外部ライブラリを探しても良いかもしれません。

投稿2019/04/24 06:52

編集2019/04/24 06:57
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mosapride

2019/04/24 13:40

splitの方が楽が気がします。に高評価です。 正規表現とsplitの速度差については理解してませんが、高繰り返し処理でないのならsplitの方が後々(あとでコードを見たとき)の事を考えてbetterかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問