私はこのコードを使用:
String line = "[ybi-173]";
Pattern cleanPattern = Pattern.compile("%|\\|,|[|]|#|&|@|!|^");
Matcher matcher = cleanPattern.matcher(line);
line = matcher.replaceAll("");
をしかし、それは動作しません。
この正規表現では、何が間違っていますか?
私はこのコードを使用:
String line = "[ybi-173]";
Pattern cleanPattern = Pattern.compile("%|\\|,|[|]|#|&|@|!|^");
Matcher matcher = cleanPattern.matcher(line);
line = matcher.replaceAll("");
をしかし、それは動作しません。
この正規表現では、何が間違っていますか?
ソリューションが機能しない理由はいくつかあります。
一致させる文字のいくつかは、^
,[
、]
などの特殊な意味を持ちます。これらは\
文字でエスケープする必要がありますが、さらに悪いことに、\
自体をエスケープして、Javaコンパイラが\
を正規表現コンストラクタに渡すようにする必要があります。したがって、ステップ1を要約すると、]
文字に一致させる場合、Java文字列は"\\]"
のようになります。
さらに、これは、代替演算子|
ではなく、文字クラス[]
の場合です。 「a
、b
、c
のいずれかの文字と一致させたい場合は、文字クラスは[%\,[]#&@!^]
となりますが、Java文字列のエスケープルールと特定の文字の特殊な意味により、正規表現は[%\\\\,\\[\\]#&@!\\^]
になります。
人々は '[%\\\\、\\\ [\\\]#&@!\\ ^]'のような凶悪な怪物を我慢するのは信じられないほどです。 **はより良い方法になってくれました!! – tchrist
私は '^'について同じことを考えていましたがそれは文字クラスの始めに特別な意味しか持たず、最後にエスケープする必要はないと思われます。 –
一部の文字は、異なる解釈をする特殊文字です。あなたはバックスラッシュでそれらすべてをエスケープするか、いっその文字クラスに入れないことができますいずれか(容易になり、非CCの文字をエスケープする必要が読みやすさ):あなたは、文字グループとして、あなたのパターンを定義したい
Pattern cleanPattern = Pattern.compile("[%\\\\,\\[\\]#&@!^]");
[
と]
で囲み、特殊文字をエスケープします。
String n = "%\\,[]#&@!^".replaceAll("[%\\\\,\\[\\]#&@!^]", "");
'\' –