java.util.regex.Matcher.replaceAll替换没有匹配?

时间:2011-01-02 04:27:21

标签: java regex pattern-matching matcher

根据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)));
    }
}

打印:

件:假

maybeABCno

等于:假

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

看一下Matcher javadoc,这里有一段摘录:

  

创建后,可以使用匹配器   进行三种不同的比赛   操作:

     
      
  • 匹配方法尝试匹配   反对的整个输入序列   图案。

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

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

  •   
     

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