2016-09-20 16 views
1

如果給出一個字符串,如"(-2)x^(-2)+(3)x^(1)-(18)x^(-45)"我將如何使用split()來獲取指數?所以這個例子會返回[-2, 1, -45]。我試圖找出正則表示法,但它很混亂。我最近來的是string.split("x\\^\\("),但它並沒有完全分裂它,我想如何。如何解析指數的多項式

+2

這不是一個很好的使用情況'split'。設置一個正則表達式匹配器並在循環中使用'find'。 – ajb

+0

你不會。你會寫一個適當的詞法分析器。 XY問題。 – EJP

+0

我將如何設置正則表達式匹配器? – lilypad111

回答

0

試試這個

String str = "(-2)x^(-2)+(3)x^(1)-(18)x^(-45)"; 
char[] chars = str.toCharArray(); 
List<String> exponents = new ArrayList<String>(); 
for(int i=0; i<chars.length; i++) { 
    if(chars[i] == '^') { 
     if(++i<chars.length && chars[i] == '(') { 
      StringBuilder sb = new StringBuilder(); 
      while(++i<chars.length && chars[i] != ')') { 
       sb.append(chars[i]); 
      } 
      exponents.add(sb.toString()); 
     } 
    } 
} 
+0

雖然有效(一目瞭然),但可以用一個正則表達式執行得更少,正如@ajb – qxz

+0

所提到的一樣,總會有折衷。我通常不喜歡使用正則表達式,因爲它們很難調試IMO,但這是我的偏好。 – blue

+0

此外,這比正則表達式版本快很多 - 如果速度很重要。 – blue

0

試試這個,如果你需要一個基於正則表達式的解決方案:

String line = "(-2)x^(-2)+(3)x^(1)-(18)x^(-45)";   
    String pattern = ".*?\\^\\(([\\d-]+)\\)[\\+-]*"; 
    Pattern r = Pattern.compile(pattern,Pattern.MULTILINE); 

    Matcher m = r.matcher(line); 
    while (m.find()) {    
     System.out.println("Found value: " + m.group(1));    
    } 

Sample Demo at Debuggex