考虑以下代码段:
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
中,这会将文本转换为正则表达式文本。
严格来说是不对的。事实上。因为如果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"
),但通常你最好使用库,因为它们往往包含更少的错误,如果有错误, 这些问题最终会得到解决。
您可以在此处找到源代码:
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"
......