0

私がしようとすると:

Pattern p = Pattern.compile("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");

私のプログラムはバグアウトします。なぜこれが好きではないのですか?

4

4 に答える 4

3

[この正規表現はコンパイルされません。これは、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)

例はドキュメントから引用されています。

于 2013-11-06T16:34:52.797 に答える
0

すでに述べたように、特殊文字をスキップする必要があります...そのためには、Pattern.quoteメソッドを使用することをお勧めします (こちらを参考にしてください)。

String s = Pattern.quote("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
Pattern p = Pattern.compile(s);
于 2013-11-06T16:44:46.570 に答える
0

これは正しい正規表現です:

Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");

あなたは逃げる必要があり[]

またはこれも機能します:

Pattern p = Pattern.compile("[],.s;:{}/\\[<>?`~!@#$%^&*()_+=]");

[エスケープする必要があるだけです。

]文字クラス内の最初の位置にある場合、エスケープを回避できます。

于 2013-11-06T16:35:32.687 に答える