0

我的输入就像

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

4 回答 4

1

我首先将 E+ 替换为一个明确的符号,例如

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

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

于 2013-02-01T05:57:08.413 回答
1

您不能使用单个正则表达式来做到这一点,因为 FP 常量在科学记数法中引入了歧义,并且在任何情况下,您都需要知道哪个标记是哪个标记,而无需重新扫描它们。您还错误地陈述了您的要求,因为您当然也需要输出中的二元运算符。您需要编写扫描仪和解析器。查看“递归下降表达式解析器”和“Dijkstra 分流场算法”。重置摘要是多余的。

于 2013-02-01T05:40:21.060 回答
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

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

于 2013-02-01T05:57:29.887 回答
0

尝试这个

String[] tokens=str.split("(?<!E)+[*\\-/()+]");
于 2013-02-01T05:29:07.133 回答