2013-09-30 110 views
1

我試圖創建一個Java程序,它能夠在輸入中綴表達式時遵循操作的順序。爲了簡化輸入,我決定使用regex表達式來分割整個字符串。我已經能夠將除6 3之外的所有內容都拆分成splitLine陣列中自己的String值。在此我SSCCE嘗試如下:Java中的infix表達式的正則表達式問題

String line = "6 + 5 + 6 3 + 18"; 
    String regex = "(?<=[-+*/()])|(?=[-+*/()])"; //Not spitting 6 3 correctly 
    String[] splitLine = line.split(regex); 
    for (int i=0; i<splitLine.length; i++) { 
     System.out.println(splitLine[i]); 
    } 

輸出:

6 
+ 
5 
+ 
6 3 //Error here 
+ 
18 

預期輸出:

6 
+ 
5 
+ 
6 //Notice 
3 //these 
+ 
18 

我試過,並試圖修改我的正則表達式的表達,並已成功。任何人都可以告訴我爲什麼我的正則表達式不會將63分割成splitLine數組中的Strings

編輯:只是想指出的是,我這樣做的樂趣,它不是任何形式的學校工作,等我只是想看看我能不能寫一個程序來進行簡單的中綴表達式。我同意有更好的方法來做到這一點,如果表達式變得更復雜,我會遇到一些問題。但不幸的是,這就是我的書如何建議我接近這一步。

再次感謝所有的快速評論和答案!

+0

首先,你的線不是字符串 - 編輯你的例子。第二,是的,你在6比3之間沒有運營商可以匹配,你期望在那裏有什麼樣的運營商? – Piro

+0

正則表達式是這項工作的錯誤工具。你需要自己寫一個適當的掃描器和解析器。不要放棄它,現在就做,你只會浪費時間堅持這種方法。 – EJP

+0

@EJP這正是我需要的。我需要每個元素都以正確的順序來表示,以便當我將它們放入堆棧時,我可以輕鬆地執行數學運算。 – Tdorno

回答

1

嘗試:(?<=[-+*/()])|(?=[-+*/()]|\\s{2,})

可以嘗試在正則表達式添加空間,這也將在存在2個或更多的空間作爲在這種情況下圖6和3由空格隔開分裂,6 3也將被分離。如果超過2個空格匹配,則此正則表達式將吐出字符串。您可以將最小空間數量更改爲\s{min,}在正則表達式中

+0

IDE給了我一個'無效的轉義序列錯誤與這個正則表達式。 – Tdorno

+0

在Java中,你必須使用反斜槓進行轉義。嘗試給\\ {2,} –

+0

啊哇,我今天不在。這正是我工作的。謝謝您的幫助。 +1並接受答案。 – Tdorno

1

以下正則表達式將匹配您當前的輸入。

\s(\w+|[-+*/()]) 

要點是搜索一個空白字符,然後從列表中選擇一個單詞或特定字符。

輸出

6 
+ 
5 
+ 
6 
3 
+ 
18 
+1

工程就像一個魅力。謝謝,+1。 – Tdorno

+0

thx但在閱讀@ EJP的評論後,我傾向於[同意](https://www.google.be/search?hl=nl&q=infix+parser&sourceid=ie8&rls=com.microsoft:nl-be:IE -address&即=&OE =)。也許正則表達式是這個工作的錯誤工具。 –

1

您可以使用類似的東西可能?

String line = "6 + 5 + 6 3 + 18"; 
String regex = "(?<=[-+*/() ])|(?=[-+*/() ])"; //Added space to character class 
String[] splitLine = line.split(regex); 
for (int i=0; i<splitLine.length; i++) { 
    if (splitLine[i].trim().equals("")) // Check for blank elements 
     continue; 
    System.out.println(splitLine[i].trim()); 
} 

或者您也可以(?<=\\d)\\s+(?=\\d)分割你的字符串得到6 + 5 + 63 + 18

+0

工程就像一個魅力。謝謝,+1。 – Tdorno