2017-08-28 5 views
2

私はhtmlコードを含む文字列を持っていて、別のURLのドメイン名をhttp://localhostに置き換えようとしていますが、正規表現は常に文字列。 私はここで間違って何をやっているこのコードはなぜJava regex replaceAll()は最後の一致のみを返します

http://localhost/ijk 

を出力生成される以下

String data = "https://example.com/abc/xyz https://sub.example.com/abc/def https://sub-example.com/abc/ijk"; 
System.out.println(data); 
data = data.replaceFirst("(http|https)://.*/abc/", "http://localhost/"); 
System.out.println(data); 

以下のコードを参照してください...私はあなたがrerstrictすべき

+4

'。*'最後の '/ abc /'の前に最長の文字列にマッチする貪欲です。 – anubhava

+0

あなたは入力の最後まで最初のhttpsから始まります。 – GhostCat

+0

'。*?'を使って文字の欲張りを少なくする – Ferrybig

答えて

2

お聞かせください.*パターンは可能な限り0以上の任意の文字に一致します。 \S*、空白以外の0以上の文字を使用してください。

さらに、すべての出現箇所を置き換えるには、.replaceAllを使用する必要があります。だから、

data = data.replaceAll("https?://\\S*/abc/", "http://localhost/"); 

を使用するには、regex demoを参照してください。

詳細

    https?
  • - http又は
  • ://https - リテラル://サブ
  • \\S* - /abc/サブ - 空白
  • /abc/以外の任意の0+文字。
+0

申し訳ありませんタイプです..実際のプログラムでreplacell()を使用しています – faheem205

+0

@ faheem205参照してください。ポイントは '。*'がここであまりにも多く一致しているということです。 URLに空白が含まれる場合は、パターンを調整する必要があることに注意してください。しかし、 '。*?'にすることはできません。 '/ abc /'はあまりにも長い時間マッチさせるかもしれません。 *?/ abc/"'](https://regex101.com/r/TgrOi0/2)のようなものが考えられます。 。 –

+0

これは私の問題を解決します..ありがとうございます – faheem205

関連する問題