2016-11-08 38 views
0

我想驗證下面的代碼中的字符串「expression」是否是公式。在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

好吧,使用正則表達式來處理這樣的事情並不是一件好事。有效的算術表達式不僅限於「它只包含某些字母」這個問題,而更多的是一種語義上的東西(每個括號都像這樣[]())被關閉,並且更多的是自然語言解析。這只是我的愚見,詳見:http://dsp.rice.edu/sites/dsp.rice.edu/files/publications/conference-paper/2015/mlp_0。pdf – Najzero

回答

0

你在你的正則表達式中使用特殊字符,你需要使用\來轉義它們。 它應該看起來像[a-zA-Z0-9+\\-*/()]。這僅測試一個字符,您需要在最後添加*以測試多個字符。

編輯(謝謝TOTO):因爲[]測試一個字符,它被稱爲字符類(實際上不像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