2013-03-14 19 views
45

私は次のコードを使用して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このメソッドは、文字列sの文字列と同じようにPatternを作成するために使用することができるStringを生成します。

入力シーケンスのメタキャラクタまたはエスケープシーケンスには特別な意味はありません。

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

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

答えて

54

\Qは、「リテラルテキストの開始」(つまり、正規表現「オープン引用」)
\EPattern.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を参照:

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

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

入力シーケンスのメタキャラクタまたはエスケープシーケンスには特別な意味はありません。

+5

'someString.matches(Pattern.quote(someLiteral)) 'に相当するのは、実際には' someString.matches( "\\ Q" + someLiteral.replace( "\\ E"、 "\\ E \\\ \ E \\ Q ")+" \\ E ")' – kbolino

+0

@kbolino Rofl。そして、 "\\ Q"の置き換えはどうですか? – Andrew

+0

@Andrewそれもそれを扱います: '' \\ Q \\ E ".matches(Pattern.quote(" \\ Q \\ E "))// true'。 – Bohemian

7

Pattern.quoteが返す文字列をコンパイルすると、quote dというリテラル文字列に一致するPatternが得られます。

\Qおよび\E文字列の引用部分の先頭と末尾に印を付けます。

8

\Q\E、他のすべての中で、徹底的にjava.util.regex.PatternのJavadocページに記述されています。それらは "begin Quote"、 "E nd quote"を意味し、すべての文字が文字通りの意味を持つ領域を明確にします。 Pattern.quoteの戻り値を使用する方法は、Pattern.compile、またはString.splitなどのパターン文字列を受け入れる他の方法にフィードする方法です。

7

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

+0

実際、そのような例の1つは、部分文字列の最初のオカレンスを置き換える場合ですが、リテラル文字列を渡す場合は、String.replaceFirstは正規表現を取ります。 –

15

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

検索プログラムにユーザーの入力があり、正規表現したいとします。しかし、この入力は、ご指摘のように、正規表現を引用符でStringをラップし、あなたがPatternを引用しない

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

このメソッドを使用することができますので、安全でない文字を持っているかもしれませんが。

関連する問題