私がしようとすると:
Pattern p = Pattern.compile("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
私のプログラムはバグアウトします。なぜこれが好きではないのですか?
[
この正規表現はコンパイルされません。これは、Java では角括弧を]
文字クラス内で使用するときにエスケープする必要があるためです。
Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");
^^^^^^
などの特別なシーケンスをエスケープするために Java 文字列で\\
スラッシュが使用されるため、ダブル エスケープが必要です。\
\n
\r
エスケープするためにスラッシュが必要な場合、Java 文字列にリテラル スラッシュを含めるにはどうすればよいでしょうか。
それ自体を使用してエスケープするため、2 回入力します\\
。
文字クラスをエスケープ[
して内部に入れる必要があるのはなぜですか?]
Java は文字クラスの減算、交差、結合をサポートしているため、次に例を示します。
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]] d, e, or f (intersection)
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)
例はドキュメントから引用されています。
すでに述べたように、特殊文字をスキップする必要があります...そのためには、Pattern.quote
メソッドを使用することをお勧めします (こちらを参考にしてください)。
String s = Pattern.quote("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
Pattern p = Pattern.compile(s);
これは正しい正規表現です:
Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");
あなたは逃げる必要があり[
、]
またはこれも機能します:
Pattern p = Pattern.compile("[],.s;:{}/\\[<>?`~!@#$%^&*()_+=]");
[
エスケープする必要があるだけです。
]
文字クラス内の最初の位置にある場合、エスケープを回避できます。