Pattern.quote()和它的String连接等价物之间的区别?

时间:2017-03-31 13:20:42

标签: java regex string

考虑以下代码:

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

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

据我所知,他们产生完全相同的输出。我知道第一个更易于阅读,如this answer中所述。 但哪种方法更好更快

1 个答案:

答案 0 :(得分:1)

答案中的陈述:

  

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

严格来说 不正确。确实。因为如果 \Q\E已经在原始字符串中,这会产生奇怪的结果。

如果您致电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"),但通常你最好使用库,因为它们往往包含更少的错误,如果有错误,最终会解决这些错误。

您可以找到source code here

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\\\\E\\Q"
相关问题