Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java正则表达式replaceAll()只返回最后一个匹配项_Java_Regex - Fatal编程技术网

为什么java正则表达式replaceAll()只返回最后一个匹配项

为什么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

我有一个包含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.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
  • ://
    -文本
    ://
    子字符串
  • \\S*
    -除空格外的任何0+字符
  • /abc/
    -一个
    /abc/
    子字符串

*
是贪婪的,它匹配最后一个
/abc/
之前最长的字符串。使用
*?
您有一个贪婪的匹配,它只会从第一个https到输入的最后一个https。使用
*?
可以减少*对字符的贪婪这解决了问题。。非常感谢抱歉这是一种。。在实际应用程序中使用replacell()program@faheem205我懂了。关键是
*
在这里匹配得太多了。请注意,如果URL可能包含空格,则可能需要调整模式。但是,它不能是
*?
,因为
/abc/
可能会使匹配再次过长。你可以考虑一些类似的事情。