2014-11-08 29 views
-1

我認爲一天的問題,但仍然無法解決它。 我有一個公式輸入像「11 + 1 + 1 + 2」。無空間在算術公式中使用分割()

我想根據運營商拆分公式。 然後我寫這樣的:

String s = "11+1+1+2"; 
String splitByOp[] = s.split("[+|-|*|/|%]"); 
for(int c=0; c < splitByOp.length; c++){ 
System.out.println(splitByOp[c]); 


The output is: 
11 
1 
1 
2 

我希望把操作數(輸出),也是運營商(+)到一個ArrayList。但是,我怎樣才能讓運營商在分拆之後保留下來?

我試着讓另一個數組分割數字。

String operator[] = s.split("\\d"); 

但結果是11成爲11.操作者的長度[]是5

換句話說,如何可以執行像:

The output: 
11 
+ 
1 
+ 
1 
+ 
2 
+0

*一些人,當遇到一個問題,想 「我知道,我將使用正則表達式。」現在他們有兩個問題。* - 傑米Zawinski撰寫 – 2014-11-08 13:24:22

+0

使用「\ b「的作品。我在w3schools中查看\ b的含義:在單詞的開頭/結尾找到匹配項。這是否意味着java自動匹配? – annie 2014-11-08 13:28:25

回答

1

請分割在正則表達式上是非消耗。具體地,在「單詞邊界」:

String[] terms = s.split("\\b"); 

A「字邊界」這個詞炭和非字字符之間的間隙,但數字被分類爲字字符。重要的是,該匹配是非消耗性的,因此輸入的所有內容都以拆分方式保留。


下面是一些測試代碼:

String s = "11+1+1+2"; 
String[] terms = s.split("\\b"); 
for (String term : terms) 
    System.out.println(term); 

輸出:

11 
+ 
1 
+ 
1 
+ 
2 
+0

我正要說,....「看起來不像是一個環顧」。 :) +1 – 2014-11-08 13:14:56

0

你可以結合超前/向後斷言

String[] array = s.split("(?=[+])|(?<=[+])"); 
0
public static void main(String[] args) { 

     String s = "11+1+1+2"; 
     String[] terms = s.split("(?=[+])|(?<=[+])"); 
     System.out.println(Arrays.toString(terms)); 
    } 

輸出

[11, +, 1, +, 1, +, 2]