その種のシーケンスに一致する必要がある正規表現は次のとおりです。
\ s *-?\ d +(?:\ s * [-+ / *] \ s *-?\ d +)+ \ s *
それを構成部品に分解しましょう!
\s* # Optional space
-? # Optional minus sign
\d+ # Mandatory digits
(?: # Start sub-regex
\s* # Optional space
[-+*/] # Mandatory single arithmetic operator
\s* # Optional space
-? # Optional minus sign
\d+ # Mandatory digits
)+ # End sub-regex: want one or more matches of it
\s* # Optional space
(スペースを一致させたくない場合は、それら\s*
をすべて削除し、ユーザーをかなり驚かせることに注意してください。)
\
ここで、上記をJavaで文字列リテラルとしてエンコードする場合(コンパイル前)、その中の各文字をエスケープするように注意する必要があります。
String regex="\\s*-?\\d+(?:\\s*[-+/*]\\s*-?\\d+)+\\s*";
もう1つ注意すべき点は、Javaが式評価ツリーを解析して構築するために、正規表現を細かく分割しないことです。(コードの残りの部分と一緒に)文字列全体と一致するかどうかだけです。(かっこをキャプチャしてもあまり役に立ちません。何らかの形の繰り返しの中に入れると、一致した文字列の最初の場所のみが報告されます。)これを適切に行う最も簡単な方法は、次のようなパーサジェネレータを使用することです。 Antlr(括弧で囲まれた部分式、演算子の優先順位の管理なども実行できます)