2016-11-08 9 views
0

以下のコードのような文字列 "式"が数式であるかどうかを検証しようとしています。 の値のJavaの数式を検証する

String expression = request.getParameter(FORMULA); 
if(!Pattern.matches("[a-zA-Z0-9+-*/()]", expression)){return new AjaxMessage(AjaxMessage.ResponseStatusEnum.FAILURE, getJsonString(, "Manager.invalid.formula" , null)); 
} 

例は、単にコンテキストの{A + B/2、(A + B)* 2、(ジョン・マックス)など}(変数名であります(正規表現の新)を使って検証しようとしましたが、分かりませんが、これは不可能だと思います。変数名の長さ。

は、正規表現またはJavaで他のライブラリを使用して検証を達成するための方法はありますか?

ありがとうございます。

+4

'[+ - *]' *範囲*を作成し、あなたの正規表現が無効になります。文字クラスの最後に '-'を置きます。 –

+2

よく、Regexを使ってこのようなことをするのは良いことではありません。有効な算術式は、「特定の文字のみを含んでいたのですか?」という意味の問題ではなく、すべての括弧がそのような[]()のように閉じられたかどうかという意味の問題ではなく、自然言語解析の問題です。それはちょうど私の謙虚な意見です。詳しくは、http://dsp.rice.edu/sites/dsp.rice.edu/files/publications/paper/2015/mlp_0を参照してください。pdf – Najzero

答えて

0

正規表現で特殊文字を使用していますが、\を使用してエスケープする必要があります。 [a-zA-Z0-9+\\-*/()]のようになります。これは、複数の文字をテストするために最後に*を追加する必要がある1文字のみをテストします。

[]は1文字をテストするため、実際にはJavaクラスと同じではないため、-のみが特別な文字と見なされます。中括弧のない正規表現では、他の特殊文字をエスケープする必要があります。

特殊文字は正規表現を使用して特別な意味を持ち、その文字として解釈されません(たとえば、括弧はグループを作成するために使用され、*は前の文字の0以上を意味します)。

文字クラスについて

https://docs.oracle.com/javase/tutorial/essential/regex/char_classes.html

詳細情報: http://www.regular-expressions.info/characters.htmlhttp://www.regular-expressions.info/refcharacters.html

私は(正規表現エンジンは変更になる場合がありますので注意!)私の正規表現をテストするには、このサイトを使用します。 https://regex101.com/

として、コメントで言えば、数学的表現は単なる異なる文字以上のものであるため、検証する場合は、さらに手作業によるチェックを行う必要があります。

+0

文字クラスでは、特殊文字をエスケープする必要はありません – Toto

+0

@Toto Javaの 'Character'ラッパークラスは何を言っているのでしょうか?ここでは使用されていません。私はあなたがJavaで\をエスケープする必要があることを忘れてしまったので編集しました... – Asoub

+0

OPの正規表現は文字クラスなので、 '-'以外のものをエスケープする必要はありません – Toto

0

理由は、正規表現で特別な意味を持つ文字を使用しているためです。それらの文字をエスケープする必要があります。私はyor正規表現を修正して動作させました。

コード:

List<String> expressions = new ArrayList<String>(); 
    expressions.add("a+b/2"); 
    expressions.add("(a+b)*2"); 
    expressions.add("john-Max"); 
    expressions.add("etc["); 
    for (String expression : expressions) { 
     if (!Pattern.matches("[a-zA-Z0-9\\+\\-\\*/\\(\\)]*", expression)) { 
      System.out.println("NOT match"); 
     } else { 
      System.out.println("MATCH"); 
     } 
    } 

} 

OUTPUT:

MATCH 
MATCH 
MATCH 
NOT match 
+0

'+'、 '('、 ')'と '*'は文字クラスでエスケープする必要はありません。 – Toto

+0

私はしたし、それは有効なJavaの正規表現として指定された式を受け入れるためにエスケープする必要がある文字クラスに関するものではありません。それ以外の場合は例外がスローされます。 –

+0

あなたのコードは "(a ++/** - b)* 2"と一致します。これは有効な数式ではありません – Eritrean