Pattern.quote方法有什么用?

时间:2013-03-14 12:27:35

标签: java regex pattern-matching

我正在尝试使用以下代码了解Pattern.quote

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545");
System.out.println("Pattern is : "+pattern);

产生输出:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E

此处\Q\E是什么?文档说明说:

  

返回指定String的文字模式String

     

此方法生成String,可用于创建与Pattern字符串匹配的s,就好像它是文字模式一样。

     

输入序列中的元字符或转义序列没有特殊含义。

但是Pattern.quote的返回类型是String而不是已编译的Pattern对象。

为什么需要此方法以及一些用法示例?

6 个答案:

答案 0 :(得分:67)

\Q表示“文字文本的开头”(即正则表达式“公开引用”)
\E表示“文字结尾”(即正则表达式“近距离引用”)

调用Pattern.quote()方法将字符串包装在\Q...\E中,将文本转换为正则表达式 literal 。例如,Pattern.quote(".*")将匹配一个点,然后是星号:

System.out.println("foo".matches(".*")); // true
System.out.println("foo".matches(Pattern.quote(".*"))); // false
System.out.println(".*".matches(Pattern.quote(".*"))); // true

该方法的目的是不要求程序员必须记住特殊术语\Q\E并为代码添加一些可读性 - 正则表达式已经足够难以阅读了。比较:

someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));

参考javadoc

  

返回指定String的文字模式String。

     

此方法生成一个String,可用于创建一个与字符串s匹配的Pattern,就像它是一个文字模式一样。

     

输入序列中的元字符或转义序列没有特殊含义。

答案 1 :(得分:16)

Pattern.quote方法引用正则表达式模式的一部分,使正则表达式将其解释为字符串文字。

假设您的搜索程序中有一些用户输入,并且您想要正则表达式。但是此输入可能包含不安全的字符,因此您可以使用

Pattern pattern = Pattern.compile(Pattern.quote(userInput));

此方法不引用Pattern,但正如您所指出的,将String包装在正则表达式引号中。

答案 2 :(得分:9)

\Q\E等所有其他内容都在java.util.regex.Pattern Javadoc页面上进行了详细记录。它们的意思是“开始 Q uote”,“ E nd quote”并且标记所有字符都具有字面含义的区域。使用Pattern.quote返回的方法是将其提供给Pattern.compile,或任何其他接受模式字符串的方法,例如String.split

答案 3 :(得分:7)

如果你编译Pattern.quote返回的字符串,你会得到一个Pattern,它与你quote d的文字字符串相匹配。

\Q\E标记字符串引用部分的开头和结尾。

答案 4 :(得分:7)

正则表达式经常与普通字符串冲突。假设我想要一个正则表达式来搜索只在运行时知道的某个字符串。我们如何确定字符串不具有正则表达式意义,例如(".*.*.*")?我们引用它。

答案 5 :(得分:0)

此方法用于将模式视为文字字符序列。 与 PATTERNLITERAL 标志的作用相同。