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

标签 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.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/");

请参阅regex demo .

详细信息

  • https? - httphttps
  • :// - 文字 :// 子字符串
  • \\S* - 除空格之外的任何 0+ 个字符
  • /abc/ - /abc/ 子字符串。

关于java - 为什么java正则表达式replaceAll()只返回最后一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45924608/

相关文章:

java - 多态性:从父类(super class)变量调用子类方法

javascript - 用于带扩展名的手机号码验证的正则表达式模式

Java Regex 找不到匹配项

java正则表达式仅匹配0-9的列表,顺序很重要

regex - 正则表达式在括号中查找数字,但仅在字符串的开头

java - 表格单元格内的前导段落

java - 哈希整个对象而不先转换为 byte[]

java - 从分隔字符串创建字符串数组。

java - 如何根据首选项设置刷新MainActivity?

python - 正则表达式从列表中删除非 A-Z a-z 的单词(异常(exception))