我的输入就像
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);
}
答案 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
请注意,它需要对不同的浮点表达式进行一些测试,但它很容易调整