2016-09-20 43 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