我正在尝试使用以下代码了解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
对象。
为什么需要此方法以及一些用法示例?
答案 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)
此方法用于将模式视为文字字符序列。
与 PATTERN
。LITERAL
标志的作用相同。