将字符串表达式拆分为标记

时间:2013-02-01 05:13:27

标签: java regex string split

我的输入就像

String str = "-1.33E+4-helloeeee+4+(5*2(10/2)5*10)/2";

我希望输出为:

1.33E+4
helloeeee
4
5
2
10
2
5
10
2

但我得到的输出为

1.33, 4, helloeeee, 4, 5, 2, 10, 2, 5, 10, 2

我想在分割“1.33e + 4”

后完全想要指数值

这是我的代码:

    String str = "-1.33E+4-helloeeee+4+(5*2(10/2)5*10)/2";
    List<String> tokensOfExpression = new ArrayList<String>();
    String[] tokens=str.split("[(?!E)+*\\-/()]+");
    for(String token:tokens)
    {   
         System.out.println(token);
         tokensOfExpression.add(token);
    }
    if(tokensOfExpression.get(0).equals(""))
    {
         tokensOfExpression.remove(0);
    }

4 个答案:

答案 0 :(得分:1)

你不能用一个正则表达式来做到这一点,因为FP常量在科学记数法中引入了歧义,并且在任何情况下你都需要知道哪个令牌不需要重新扫描它们。你也错误地说明了你的要求,因为你当然也需要输出中的二元运算符。您需要同时编写扫描程序和解析程序。看看'递归下降表达式解析器'和'Dijkstra shunting-yard算法'。重新设置摘要是多余的。

答案 1 :(得分:1)

我首先用一个不含糊的符号替换E +,例如

str.ReplaceAll("E+","SCINOT");

然后,您可以使用StringTokenizer进行解析,在需要评估科学记数法中表示的数字时替换SCINOT符号。

答案 2 :(得分:0)

试试这个

String[] tokens=str.split("(?<!E)+[*\\-/()+]");

答案 3 :(得分:0)

使用Matcher

更容易实现结果
    String str = "-1.33E+4-helloeeee+4+(5*2(10/2)5*10)/2";
    Matcher m = Pattern.compile("\\d+\\.\\d*E[+-]?\\d+|\\w+").matcher(str);
    while(m.find()) {
        System.out.println(m.group());
    }

打印

1.33E+4
helloeeee
4
5
2
10
2
5
10
2

请注意,它需要对不同的浮点表达式进行一些测试,但它很容易调整