2014-03-28 75 views
1

經過一段時間處理此問題後,我無法準確計算出我需要的Regex語法。使用Java拆分來評估數學表達式

在我學習的一門Java課程中,我們接受了構建一個能夠表達字符串(使用或不使用圓括號)並正確評估它的計算器的任務。

表達的解析背後的概念是,你有一個字符串...

5+16/20-56+7-20*16/9

而且要通過 '分裂' 拿到兩分的ArrayLists:

{5,16,20,56,7,20,16,9} {+,/,-,+,-,*,/}

然後,您可以按照操作優先級逐個執行操作,從ArrayList清空操作,直到您的數組數組ha一個要素:最終結果。

不幸的是,我沒有Regex的經驗,也不能讓任何意義我正在閱讀的教程和示例。

我不知道如何根據"[*-/+]"拆分,我不知道如何選擇整個號碼拆分而不是單純的數字。由於這些錯誤,我無法讓我的代碼編譯。代碼的一個工作片斷我卻得到:

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Tester 
{ 
    public static void main(String[] args) 
    { 
     String expression = "3+5+6-10*20/150-14+76%2"; 

//  String[] operands = expression.split(""); 
     String[] operators = expression.split("[0-9]"); 

//  System.out.println(operands); 
     System.out.println(operators); 
    } 
} 

結果

[Ljava.lang.String;@308ab721 

而且我不知道從哪裏是從何而來。

任何人都可以幫我弄清楚我做錯了什麼嗎?或者指向一個非常好的初學者課 on Regex?

我感謝你的幫助,每個人。

回答

2

operandsoperatorsarray

打印array你可以做

System.out.println(Arrays.toString(operands)); 
System.out.println(Arrays.toString(operators)); 

你應該像這樣把它分解:

String[] operands = expression.split("[\\+\\-\\*\\%\\/]"); 
String[] operators = expression.split("[0-9]+"); 
+1

第一種模式中的反斜槓都不是必需的,儘管它們是無害的。 – ajb

+0

沒關係,修改它。但它是一個很好的做法,在正則表達式中包含轉義字符(for begginner)。因爲在某些情況下,這是必須的。例如'replaceAll()' – Baby

+0

對不起,您*在*之前需要*,以便它不會將其視爲範圍。我沒有一個美好的一天。對錯誤信息抱歉。 – ajb

1

您正在輸出變量的內存地址。如果你想要一個字符串表示,可以做

System.out.println(Arrays.toString(operators)); 

發生了什麼幕後是println()方法傳遞給它的任何對象上調用toString()。對於Java中的數組,默認實現toString()將返回內存地址,這就是爲什麼您會打印出這個醜陋的東西。

1

我不是專家,但是這應該爲你工作:

public static void main(String[] args) 
{  
    String expression = "3+5+6-10*20/150-14+76%2"; 

    String[] operands = expression.split("[-+*%/]"); 
    String[] operators = expression.split("[0-9]+"); 

    System.out.println(Arrays.toString(operands)); 
    System.out.println(Arrays.toString(operators)); 
} 

您需要轉義正則表達式元字符(或者在這種情況下只是更改順序),並正確地打印您的陣列。

有點闡述:

在正則表達式中,某些字符具有特殊的含義。您已經通過定義範圍0-9使用了這些,其中破折號是元字符。這同樣適用於-。你可以看到一個完整的列表here

我實際上使用了修改後的數字匹配模式中的+元字符(它「與前面的子表達式匹配一次或多次」),以減少拾取的空字符串的數量。它通過匹配一個或多個匹配的數字來實現。

+1

(1)當你在'[]'裏面時,你不需要轉義大多數元字符。特別是,'+'和'*'在方括號內沒有特殊含義。 (2)如果你確實逃脫了它們,你會用反斜槓來做,而不是正斜槓。你在這裏所做的一切就是在你的角色類中加入5次斜線,這是無害的,但看起來很愚蠢。 – ajb

+0

@ajb 1斜線是師的操作員。我認爲你必須加倍逃避元字符,但我錯了。謝謝,編輯。 – Azar

+0

那麼,你是兩個多餘的斜槓,而不是四個。 – ajb

0

如果它是簡單的數字或非數字,正則表達式是簡單的:

String[] operands = expression.split("\\D+"); 
String[] operators = expression.replaceAll("^\\d+", "").split("\\d+"); 

正則表達式的含義是:

replaceAll()的調用修改表達式中的前導數字,所以您不會獲得第一個運算符的空白。