2017-08-28 456 views
2

我有一個字符串,其中包含html代碼,並試圖將其中的不同URL的域名替換爲http://localhost但我應用的正則表達式總是返回最後一個匹配而不是整個串。 請參考下面爲什麼java正則表達式replaceAll()只返回最後一個匹配

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); 

下面的代碼片段被輸出這段代碼生成

http://localhost/ijk 

我在做什麼錯在這裏...請讓我知道

+4

'*'是貪婪的將最後一個'/ ABC /使用''之前匹配最長的字符串。*?' – anubhava

+0

您有簡單地從第一HTTPS產生一個貪婪的匹配到你輸入的盡頭。 – GhostCat

+0

使用'。*?'可以減少字符的貪婪 – Ferrybig

回答

2

你應該rerstrict的.*模式,因爲它匹配儘可能多的任何0+字符。使用\S*,除空格以外的任何0+字符。

此外,您需要使用.replaceAll來替換所有的事件。

因此,使用

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

regex demo

詳細

  • https? - httphttps
  • :// - 字面://
  • \\S* - 一個/abc/子 - 除空白
  • /abc/其他任何0+字符。
+0

對不起,這是一種類型..在實際的程序中使用replacell() – faheem205

+0

@ faheem205我明白了。重點是'。*'在這裏匹配得太多了。請注意,如果URL可能包含空格,則模式可能需要調整。但是,它不能是'。*?',因爲'/ abc /'可能會使匹配時間過長。你可能會考慮像['「https?://(?:(?!https?://)。)*?/ abc /」'](https://regex101.com/r/TgrOi0/2) 。 –

+0

這解決了我的問題。非常感謝 – faheem205

相關問題