根据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
等于:假
答案 0 :(得分:2)
matches
on如果整个字符串匹配则返回true - 它与子字符串不匹配。
因此,如果stringWithSingleSlash
只是"\\"
而不是"mabye\\no"
,则matches
将返回true。
如果doubleSlash
与单个反斜杠匹配的事实让您感到困惑,那么解释是"\\\\"
是一个带有两个反斜杠的字符串,正则表达式引擎将两个反斜杠解释为一个反斜杠(因为反斜杠是正则表达式和字符串文字中的转义字符。)
答案 1 :(得分:0)
matches()
函数尝试将模式与整个字符串进行匹配
您应该使用的是检查.find()
是否返回true
。
看一下Matcher javadoc,这里有一段摘录:
创建后,可以使用匹配器 进行三种不同的比赛 操作:
匹配方法尝试匹配 反对的整个输入序列 图案。
lookingAt方法尝试匹配 输入序列,从...开始 开始,反对模式。
find方法扫描输入 顺序寻找下一个 与模式匹配的子序列。
这些方法中的每一个都返回一个 boolean表示成功或失败。 有关成功的更多信息 匹配可以通过查询获得 匹配者的状态。