【问题标题】:Why does String.replaceAll(".*", "REPLACEMENT") give unexpected behavior in Java 8?为什么 String.replaceAll(".*", "REPLACEMENT") 在 Java 8 中会出现意外行为?
【发布时间】:2020-03-23 20:47:27
【问题描述】:

当给定的正则表达式为“.*”时,Java 8 的 String.replaceAll(regexStr, replacementStr) 不起作用。结果是replacementStr 的两倍。例如:

String regexStr = ".*";
String replacementStr = "REPLACEMENT"
String initialStr = "hello";
String finalStr = initialStr.replaceAll(regexStr, replacementStr);

// Expected Result: finalStr == "REPLACEMENT"
// Actual Result: finalStr == "REPLACEMENTREPLACEMENT"

我知道当正则表达式为“.*”时使用 replaceAll() 并不完全有意义,但正则表达式不是硬编码的,可能是其他正则表达式字符串。为什么这不起作用?它是 Java 8 中的错误吗?

【问题讨论】:

  • .* is supposed to match twice。这就是正则表达式的工作原理。
  • .* 匹配末尾的空字符串。请改用.+
  • 我也想编辑空字符串。
  • 如果您不想保留原始字符串,为什么要使用替换?只需完全丢弃您的原始字符串并使用替换。
  • 只需使用replaceFirst 而不是replaceAll

标签: java regex java-8


【解决方案1】:
// specify start and end of line

String regexStr = "^.*$";
String replacementStr = "REPLACEMENT"
String initialStr = "hello";
String finalStr = initialStr.replaceAll(regexStr, replacementStr);

【讨论】:

  • 原始模式的两个匹配项都在行尾,因此$ 不会添加任何内容。只有行首标记 ^ 是相关的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2021-09-28
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多