Pattern.quote() 和它的 String catenation 等效物之间的区别?



考虑以下代码段:

Pattern p = Pattern.compile(Pattern.quote("[r.e.g.e.x]"));

Pattern p = Pattern.compile("\Q" + "[r.e.g.e.x]" + "\E");

据我所知,它们产生完全相同的输出。我知道第一个更容易阅读,如本答案所述。但是哪种方法更好更快

答案中的陈述:

调用Pattern.quote()方法将字符串包装在Q...E中,这会将文本转换为正则表达式文本。

严格来说是不的。事实上。因为如果QE已经在原始字符串中,那会给出奇怪的结果。

例如,如果您调用Pattern.quote("\Q[r.e.g.e.x]\E")它将产生"\Q\Q[r.e.g.e.x]\E\\E\Q\E"

因此,包装"\Q""\E"显然是不正确的(对于某些边缘情况,我承认)。如果你想安全,你最好使用Pattern.quote

用你自己做的"\Q""\E"包装会快一点(因为你节省了方法调用、indexOf(..)if语句,以防万一没有"\E"),但通常你最好使用库,因为它们往往包含更少的错误,如果有错误, 这些问题最终会得到解决。

您可以在此处找到源代码:

public static String quote(String s) {
int slashEIndex = s.indexOf("\E");
if (slashEIndex == -1)
return "\Q" + s + "\E";
StringBuilder sb = new StringBuilder(s.length() * 2);
sb.append("\Q");
slashEIndex = 0;
int current = 0;
while ((slashEIndex = s.indexOf("\E", current)) != -1) {
sb.append(s.substring(current, slashEIndex));
current = slashEIndex + 2;
sb.append("\E\\E\Q");
}
sb.append(s.substring(current, s.length()));
sb.append("\E");
return sb.toString();
}

所以只要没有"\E",我们就没事。但在另一种情况下,我们必须用"\E\\E\Q"替换每个"\E"......

最新更新