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

このメソッドは、文字列に一致するをリテラルパターンであるかのStringように作成するために使用できるを生成します。Patterns

入力シーケンスのメタ文字またはエスケープシーケンスには、特別な意味はありません。

しかし、Pattern.quoteの戻り型はStringコンパイルされたPatternオブジェクトではなく、です。

この方法が必要な理由といくつかの使用例は何ですか?

4

6 に答える 6

85

\Q「リテラル テキストの開始」を意味します (つまり、正規表現の「開始引用符」)
\E。 「リテラル テキストの終了」を意味します (つまり、正規表現の「終了引用符」)。

メソッドを呼び出すとPattern.quote()、文字列が でラップされ、テキスト is が正規表現リテラル\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を参照します。

指定された String のリテラル パターン String を返します。

このメソッドは、リテラル パターンであるかのように文字列 s に一致する Pattern を作成するために使用できる String を生成します。

入力シーケンス内のメタ文字またはエスケープ シーケンスには、特別な意味はありません。

于 2013-03-14T12:30:19.527 に答える
18

このPattern.quoteメソッドは、正規表現パターンの一部を引用して、正規表現に文字列リテラルとして解釈させます。

検索プログラムにユーザー入力があり、それを正規表現したいとします。ただし、この入力には安全でない文字が含まれている可能性があるため、使用できます

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

このメソッドは a を引用しませんPatternが、ご指摘のとおり、aStringを正規表現の引用符で囲みます。

于 2013-03-14T12:32:28.297 に答える
10

\Qおよび\E、とりわけjava.util.regex.Pattern Javadoc ページで完全に文書化されています。それらは「引用を開始する、「引用を終了する」を意味し、すべての文字が文字通りの意味を持つ領域を示します。の戻り値を使用する方法は、 、または などのパターン文字列を受け入れるその他のメソッドPattern.quoteにフィードすることです。Pattern.compileString.split

于 2013-03-14T12:30:24.607 に答える
7

によって返された文字列をコンパイルすると、取得したリテラル文字列と一致するPattern.quotea が得られます。Patternquote

\Q\E文字列の引用部分の最初と最後をマークします。

于 2013-03-14T12:30:04.483 に答える
7

正規表現は通常の文字列と頻繁に衝突します。実行時にのみ認識される特定の文字列を正規表現で検索したいとします。文字列がeg()を意味する正規表現を持っていないことをどのように確認できます".*.*.*"か? 引用します。

于 2013-03-14T12:30:31.110 に答える