考虑下面的代码片段:Pattern.quote()和它的字符串串联等效之间的区别?
Pattern p = Pattern.compile(Pattern.quote("[r.e.g.e.x]"));
和
Pattern p = Pattern.compile("\\Q" + "[r.e.g.e.x]" + "\\E");
据我所知,他们生产完全相同的输出。我知道第一个更容易阅读,如this answer中所述。 但是哪种方法更好更好或更快?
考虑下面的代码片段:Pattern.quote()和它的字符串串联等效之间的区别?
Pattern p = Pattern.compile(Pattern.quote("[r.e.g.e.x]"));
和
Pattern p = Pattern.compile("\\Q" + "[r.e.g.e.x]" + "\\E");
据我所知,他们生产完全相同的输出。我知道第一个更容易阅读,如this answer中所述。 但是哪种方法更好更好或更快?
在回答声明:
调用
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"
...
Euhm''\\ Q [regex] \\ E“'会产生''\\ Q \\ Q [regex] \\ E \\\\ E \\ Q \\ E“'... –
@WillemVanOnsem为什么? – sudo
,否则输入中的'\\ E“将不会被转换为文字。 –