Java Pattern.quote方法的用途是什么?
我试图理解Java Pattern.quote方法的用途是什么?,java,regex,pattern-matching,Java,Regex,Pattern Matching,我试图理解模式。使用以下代码引用: 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 = 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
此方法生成一个字符串
,可用于创建一个模式
,该模式将匹配字符串s
,就像它是一个文字模式一样
输入序列中的元字符或转义序列没有特殊意义
但是Pattern.quote
的返回类型是String
,而不是编译的Pattern
对象
为什么需要这个方法?有哪些用法示例?如果编译模式.quote
返回的字符串,您将得到一个模式
,它与模式所引用的文本字符串相匹配
\Q
和\E
标记字符串引用部分的开头和结尾。\Q
表示“文本的开头”(即regex“open quote”)
\E
表示“文本结尾”(即regex“close quote”)
调用Pattern.quote()
方法将字符串包装在\Q..\E
中,从而将文本转换为正则表达式文本。例如,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
,并为代码增加一点可读性-regex已经很难阅读了。比较:
someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));
关于:
返回指定字符串的文本模式字符串
此方法生成一个字符串,该字符串可用于创建与字符串匹配的模式,就像它是文字模式一样
输入序列中的元字符或转义序列没有特殊意义
\Q
和\E
以及所有其他内容都在Javadoc页面上详细记录。它们的意思是“开始引用”、“结束引用”和标记一个所有字符都具有字面意义的区域。使用Pattern.quote
返回的方法是将其馈送到Pattern.compile
,或任何其他接受模式字符串的方法,例如string.split
正则表达式经常与普通字符串冲突。假设我想要一个正则表达式来搜索某个只有在运行时才知道的字符串。我们如何确保字符串没有regex的意思,例如(“***”
)?我们引用它。模式。quote
方法引用正则表达式模式的一部分,使正则表达式将其解释为字符串文本
假设您在搜索程序中有一些用户输入,并且您希望为其使用regex。但此输入可能包含不安全字符,因此您可以使用
Pattern pattern = Pattern.compile(Pattern.quote(userInput));
此方法不引用模式
,但正如您所指出的,将字符串
包装在正则表达式引号中。此方法用于将模式视为一个文字字符序列。
这与模式
文字
标志的效果相同。事实上,这样的一个例子是,当您要替换第一个出现的子字符串时,但是当您要传递文字字符串时,String.replaceFirst接受一个正则表达式。正确等效于someString.matches(PATTERN.quote(someLiteral))
实际上是someString.matches(“\\Q”+somesliteral.replace(“\\E”、“\\E\\\E\\Q”)+“\\E”)
@kbolino-Rofl。替换“\\Q”?@Andrew它也能处理:“\\Q\\E.matches(Pattern.quote(\\Q\\E”)//true
。Nein:“\\Q”变为“\\Q\\Q\\E”,no?”@Andrew是的,但正则表达式足够聪明,知道如何处理:引用的文本从一个\Q
(独占)到下一个\E
(独占),可包括任意数量的\Q
序列。