Pattern.quote方法有什么用?

Pra*_*eek 53 java regex pattern-matching

我试图理解Pattern.quote使用以下代码:

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

产生输出:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E
Run Code Online (Sandbox Code Playgroud)

什么是\Q\E这里?文档说明说:

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

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

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

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

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

Boh*_*ian 69

\Q表示"文字文本的开头"(即正则表达式"公开引用")
\E表示"文字结尾"(即正则表达式"密切引用")

调用该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
Run Code Online (Sandbox Code Playgroud)

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

someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));
Run Code Online (Sandbox Code Playgroud)

参考javadoc:

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

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

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

  • 正确的等同于`someString.matches(Pattern.quote(someLiteral))`实际上是`someString.matches("\\ Q"+ someLiteral.replace("\\ E","\\ E \\\\ E\\ Q")+"\\ E")` (5认同)
  • @Andrew 是的,但正则表达式足够聪明,知道如何处理:引用的文本是从`\Q`(独占)到下一个`\E`(独占)的所有内容,其中可能包括任意数量的`\Q ` 序列。 (2认同)

Bor*_*der 16

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

假设您的搜索程序中有一些用户输入,并且您想要正确使用它.但是这个输入可能有不安全的字符,所以你可以使用

Pattern pattern = Pattern.compile(Pattern.quote(userInput));
Run Code Online (Sandbox Code Playgroud)

这个方法没有引用,Pattern但正如你所指出的那样,包含一个String正则表达式的引号.


Mar*_*nik 9

\Q并且\E,在所有其他方面,在java.util.regex.Pattern Javadoc页面上进行了详细记录.他们的意思是"开头Q uote"," ê次报价"和丹麦,所有的字符具有字面意义的区域.使用return的方法Pattern.quote是将其提供给Pattern.compile,或者接受模式字符串的任何其他方法,例如String.split.


Ope*_*uce 7

如果你编译返回的字符串Pattern.quote,你将得到一个Pattern匹配你的文字字符串quote.

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


spe*_*der 7

正则表达式经常与普通字符串发生冲突.假设我想要一个正则表达式来搜索只在运行时知道的某个字符串.我们怎样才能确定字符串没有正则表达式,例如(".*.*.*")?我们引用它.