web-dev-qa-db-ja.com

パターンのコンパイルで角括弧をエスケープする方法

正規表現のコンマ区切りのリストがあります。

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]

カンマで分割しました。今、私はこの正規表現を生成されたパスワードと照合しようとしています。問題は、Pattern.compileがエスケープされない角括弧を好まないことです。 [0-9]のような文字列を取り、エスケープされた文字列\[0-9\]を返す単純な関数を教えてください。

25
Afamee

Pattern.quote(String) を使用できます。

ドキュメントから:

public static String quote​(String s)

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

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

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

24

どういうわけか、上記の答えは私にはうまくいきませんでした。私のように後に来る人のために、ここに私が見つけたものがあります。

単一のバックスラッシュでブラケットをエスケープすると想定していましたが、パターンが文字列に格納されている場合は2つ使用する必要があります。最初のバックスラッシュは2番目のバックスラッシュを文字列にエスケープするため、正規表現は\]を認識します。正規表現はバックスラッシュを1つだけ見るので、それを使用して角括弧をエスケープします。

\\] 

正規表現では、これは単一の閉じ角括弧と一致します。

たとえば、改行を一致させようとしている場合は、バックスラッシュを1つだけ使用します。文字列エスケープパターンを使用して、文字列に改行文字を挿入しています。正規表現は\nを認識しません-改行文字を認識し、それに一致します。これは文字列のエスケープシーケンスではなく、正規表現のエスケープシーケンスであるため、2つのバックスラッシュが必要です。

33
Cullub

\ Qと\ Eの特殊文字を使用できます。\ Qと\ Eの間はすべて自動的にエスケープされます。

\Q[0-9]\E
13
Dan Breen

Pattern.compile()は角かっこで結構です。ひもを取れば

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"

そして、それをコンマで区切ると、5つの完全に有効な正規表現が得られます。最初の正規表現は8つの非行区切り文字に一致し、2番目はASCII数字に一致します。以下同様です。 ".{8}""[0-9]"のような文字列に一致させたいのですが、何をエスケープする必要があるのか​​わかりません。

3
Alan Moore