【问题标题】:java.util.regex.Matcher.replaceAll replacing without a match?java.util.regex.Matcher.replaceAll 替换没有匹配?
【发布时间】:2026-02-13 04:35:02
【问题描述】:

根据javadoc:

用给定的替换字符串替换与模式匹配的输入序列的每个子序列。

这似乎表明此调用不会替换,除非进行匹配。

然而:

public class MisMatch {
    public static void main(String args[]){
        Pattern doubleSlash = Pattern.compile("\\\\");
        String stringWithSingleSlash = "maybe\\no";
        System.out.println("Matches:"+doubleSlash.matcher(stringWithSingleSlash).matches());
        String replace = doubleSlash.matcher(stringWithSingleSlash).replaceAll("ABC");
        System.out.println(replace);
        System.out.println("Equal:"+(stringWithSingleSlash.equals(replace)));
    }
}

打印出来:

匹配:假

也许ABC没有

等于:假

  • 所以它不匹配,但仍在替换。我在这里错过了什么?

【问题讨论】:

    标签: java regex pattern-matching matcher


    【解决方案1】:

    matches() 函数尝试将模式与整个字符串进行匹配。
    看来您应该使用的是检查.find() 是否返回true

    看看Matcher javadoc,摘录如下:

    一旦创建,匹配器可用于 进行三种不同的比赛 操作:

    • matches 方法尝试匹配 整个输入序列对 模式。

    • lookingAt 方法尝试匹配 输入序列,从 开始,与模式相反。

    • find 方法扫描输入 寻找下一个的序列 匹配模式的子序列。

    这些方法中的每一个都返回一个 表示成功或失败的布尔值。 有关成功的更多信息 可以通过查询获得匹配 匹配器的状态。

    【讨论】:

      【解决方案2】:

      matches on 如果整个字符串匹配,则返回 true - 它不匹配子字符串。

      因此,如果 stringWithSingleSlash 只是 "\\" 而不是 "mabye\\no"matches 将返回 true。

      如果doubleSlash 匹配单个反斜杠这一事实让您感到困惑,则解释是"\\\\" 是一个带有两个反斜杠的字符串,并且正则表达式引擎将两个反斜杠解释为一个转义反斜杠(因为反斜杠是一个转义字符正则表达式以及字符串文字)。

      【讨论】:

        最近更新 更多