次のコードを使用して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
オブジェクトではありません。
この方法が必要な理由と使用例は何ですか?
_\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をリテラルパターンであるかのように一致させるパターンを作成するために使用できる文字列を生成します。
入力シーケンス内のメタ文字またはエスケープシーケンスには、特別な意味はありません。
Pattern.quote
メソッドは、正規表現を文字列リテラルとして解釈するように正規表現パターンの一部を引用します。
検索プログラムにユーザー入力があり、正規表現を使用するとします。ただし、この入力には安全でない文字が含まれている可能性があるため、使用できます
Pattern pattern = Pattern.compile(Pattern.quote(userInput));
このメソッドはPattern
を引用しませんが、指摘するように、String
を正規表現引用符で囲みます。
\Q
および\E
は、他のすべての中でも特に、 Java.util.regex.Pattern Javadocページに完全に文書化されています。彼らは「始めます」を意味します Qうおて」、「EPattern.quote
の戻り値を使用する方法は、Pattern.compile
、またはString.split
などのパターン文字列を受け入れる他のメソッドにフィードすることです。
Pattern.quote
によって返された文字列をコンパイルすると、Pattern
dのリテラル文字列に一致するquote
を取得します。
\Q
および\E
は、文字列の引用部分の開始と終了を示します。
正規表現は、通常の文字列と頻繁に衝突します。実行時にのみ知られている特定の文字列を正規表現で検索したいとします。文字列にeg(".*.*.*"
)を意味する正規表現がないことをどのようにして確認できますか?引用します。