67

我正在尝试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

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

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

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

为什么需要这种方法?有哪些使用示例?

4

6 回答 6

85

\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

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

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

参考javadoc

返回指定字符串的文字模式字符串。

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

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

于 2013-03-14T12:30:19.527 回答
18

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

假设您在搜索程序中有一些用户输入,并且您想对其进行正则表达式。但是这个输入可能有不安全的字符,所以你可以使用

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

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

于 2013-03-14T12:32:28.297 回答
10

\Q\E,除其他外,在java.util.regex.Pattern Javadoc 页面上进行了详尽的记录。它们的意思是“begin Q uote”、“ E nd quote”,并划定一个所有字符都具有字面意义的区域。使用 return of 的方法Pattern.quote是将其提供给Pattern.compile,或任何其他接受模式字符串的方法,例如String.split.

于 2013-03-14T12:30:24.607 回答
7

如果您编译由返回的字符串Pattern.quote,您将获得与您dPattern的文字字符串匹配的a。quote

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

于 2013-03-14T12:30:04.483 回答
7

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

于 2013-03-14T12:30:31.110 回答
0

此方法用于使模式被视为文字字符序列。这与 a 具有相同的效果PATTERNLITERAL旗帜。

于 2020-04-02T07:54:47.303 回答