为什么java正则表达式replaceAll()只返回最后一个匹配项
我有一个包含html代码的字符串,试图将其中不同URL的域名替换为为什么java正则表达式replaceAll()只返回最后一个匹配项,java,regex,Java,Regex,我有一个包含html代码的字符串,试图将其中不同URL的域名替换为http://localhost但是我应用的正则表达式总是返回最后一个匹配项,而不是整个字符串。 请参阅下面的代码片段 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.replaceFir
http://localhost
但是我应用的正则表达式总是返回最后一个匹配项,而不是整个字符串。
请参阅下面的代码片段
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
我在这里做错了什么。。。请让我知道您应该重新限制
*
模式,因为它尽可能多地匹配任何0+字符。使用\S*
,除空格外的任何0+字符
此外,还需要使用.replaceAll
替换所有出现的情况
所以,使用
data = data.replaceAll("https?://\\S*/abc/", "http://localhost/");
看
详细信息
-https?
或http
https
-文本://
子字符串://
-除空格外的任何0+字符\\S*
-一个/abc/
子字符串/abc/
*
是贪婪的,它匹配最后一个/abc/
之前最长的字符串。使用*?
您有一个贪婪的匹配,它只会从第一个https到输入的最后一个https。使用*?
可以减少*对字符的贪婪这解决了问题。。非常感谢抱歉这是一种。。在实际应用程序中使用replacell()program@faheem205我懂了。关键是*
在这里匹配得太多了。请注意,如果URL可能包含空格,则可能需要调整模式。但是,它不能是*?
,因为/abc/
可能会使匹配再次过长。你可以考虑一些类似的事情。