2011-09-30 19 views
13

私の式クラスに渡された式に演算子があるかどうかを調べようとしています。それぞれ加算、減算、乗算、除算、および指数の場合は+-*/^です。文字クラスのJava正規表現の不正なエスケープ文字

このコードで何が問題になっていますか?

private static boolean hasOperator(String expression) 
{ 
    return expression.matches("[\+-\*/\^]+"); 
} 

私は特殊文字を適切にエスケープしていたが、私はエラーになっておくことを考えた:コンパイルしようとしたときに、「違法なエスケープ文字を」。

ありがとうございました。

答えて

27

はエスケープする必要がないものをエスケープしないでください:

return expression.matches("[-+*/^]+"); 

はうまく動作するはずです。文字クラスで使用すると、ほとんどの正規表現メタキャラクタ(.()+*など)は特別な意味を失います。注意が必要なのは、[,-^、および]です。

  • ^は右開きブラケットの後を除いてどこにでも配置することができます:[a^]
  • -に配置することができ、彼らは特別な意味を取ることはありませんので、最後の3のために、あなたは戦略的にそれらに文字クラスを配置することができます[-a]又は[a-]
  • ]右開口ブラケットの後に配置することができる:右開口ブラケット後、または右閉鎖ブラケット前[]a]

しかし、あなたは正規表現文字列にエスケープ文字としてバックスラッシュを含める必要がある場合は、今後の参考のために、あなたは例えば、二回それをエスケープする必要があります:

"\\(.*?\\)" // match something inside parentheses 

だから、文字通りのバックスラッシュを一致させるために、あなたの」 Dの必要性それらの4:

"hello\\\\world" // this regex matches hello\world 

別のノート:String.matches()は、あなたの文字列は、オペレータのちょうど束で構成されていない限り、あなたがする必要がありますので、パターンに対して全体文字列にマッチしようとします代わりに.matches(".*[-+*/^].*");のようなものを使用してください(またはMatcher.find()を使用)

+0

私は、プラスまたはマイナスまたはアスタリスク」と表示されます。これを明確にしてくれてありがとう! – WebChemist