web-dev-qa-db-ja.com

Pattern.quoteメソッドの使用とは何ですか?

次のコードを使用して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オブジェクトではありません。

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

52
Prateek

_\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 の参照:

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

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

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

68
Bohemian

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

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

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

このメソッドはPatternを引用しませんが、指摘するように、Stringを正規表現引用符で囲みます。

16

\Qおよび\Eは、他のすべての中でも特に、 Java.util.regex.Pattern Javadocページに完全に文書化されています。彼らは「始めます」を意味します Qうおて」、「EPattern.quoteの戻り値を使用する方法は、Pattern.compile、またはString.splitなどのパターン文字列を受け入れる他のメソッドにフィードすることです。

9
Marko Topolnik

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

\Qおよび\Eは、文字列の引用部分の開始と終了を示します。

7
OpenSauce

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

7
spender