2

根据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没有

等于:假

  • 所以它不匹配,但仍在替换。我在这里想念什么?
4

2 回答 2

2

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

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

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

于 2011-01-02T04:35:58.443 回答
0

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

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

创建后,匹配器可用于执行三种不同类型的匹配操作:

  • matches 方法尝试将整个输入序列与模式进行匹配。

  • lookingAt 方法尝试将输入序列从开头开始与模式进行匹配。

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

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

于 2011-01-02T04:38:50.447 回答