[英]How to Split a logical expression on operators as delimiters, while keeping them in the result?
[英]How to Split a mathematical expression on operators as delimiters, while keeping them in the result?
我需要拆分一个表达式
a+b-c*d/e
并分别得到a
, b
, c
, d
, e
(作为字符串数组)以及=
, -
, *
, d
, /
(也是一组运算符)。 我尝试过:
String myString;
String myString={"a+b-c*d/e");
String[] result=new String();
String[] separator=new String[]{"+","-","/","*"};
result=myString.split(separator);
但是,它显示错误。 怎么解决?
第一个问题: -
String myString;
多重声明String myString;
第二个问题: -
字符串初始化不正确。 两端缺少双引号。 从两端卸下支架和支架。
String myString = "a+b-c*d/e";
第3个问题: -
String数组使用String对象而不是数组对象初始化。
String[] result=new String(); // Should be `new String[size]`
实际上,您不需要事先初始化数组。
第四个问题: -
String.split
将Regular Expression作为参数,您已经传递了一个数组。 不管用。
采用: -
String[] result = myString.split("[-+*/]");
拆分所有运营商。
关于你的这句话: -
以及
=, -, *, d, /
(也是一组运算符)分开。
我不明白你想要什么。 您的示例字符串不包含=
。 并且d
不是operator
。 请查看是否要编辑它。
更新: -
如果你的意思是在数组中保留运算符,你可以使用这个正则表达式: -
String myString= "a+b-c*d/e";
String[] result = myString.split("(?<=[-+*/])|(?=[-+*/])");
System.out.println(Arrays.toString(result));
/*** Just to see, what the two parts in the above regex print separately ***/
System.out.println(Arrays.toString(myString.split("(?<=[-+*/])")));
System.out.println(Arrays.toString(myString.split("(?=[-+*/])")));
输出: -
[a, +, b, -, c, *, d, /, e]
[a+, b-, c*, d/, e]
[a, +b, -c, *d, /e]
(?<=...)
表示后look-behind assertion
, (?=...)
表示look-ahead assertion
。
除了split
方法,您还可以使用java.util.StringTokenizer
:
String myString = "a+b-c*d/e";
List<String> operatorList = new ArrayList<String>();
List<String> operandList = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(myString, "+-*/", true);
while (st.hasMoreTokens()) {
String token = st.nextToken();
if ("+-/*".contains(token)) {
operatorList.add(token);
} else {
operandList.add(token);
}
}
System.out.println("Operators:" + operatorList);
System.out.println("Operands:" + operandList);
结果:
Operators:[+, -, *, /]
Operands:[a, b, c, d, e]
只是为了获得a / b / c / d / e:
String myString = "a+b-c*d/e";
String[] result=myString.split("[-+*/]");
以更易读的形式:
String myString = "a+b-c*d/e";
String[] result2=myString.split("["+Pattern.quote("+-*/")+"]");
获得+ - * /:
ArrayList<Character> list = new ArrayList<Character>();
for (char c:myString.toCharArray())
{
if ("+-*/".contains(""+c)) list.add(c);
}
System.out.println(list);
编辑:删除不需要的转义字符。
开箱即用,据我所知,你不能做你想做的事。 split(String regex)
不占用整个数组(与C#不同),只是表示有效正则表达式的字符串。
你可以做的是定义一个包含你的运算符和2个ArrayLists
的Set
。 一旦你有了,你迭代你的字符串,检查集合是否包含给定的字符(从而确定它是否是一个运算符)。 如果是,那么,你把它放在一个列表中,如果没有,你把它放在另一个列表中。
最后,您可以使用toArray(new String\\[arraySize\\])
将ArrayLists
作为String数组返回。
我想你想要做的,更像是一个解析器,而不是一个tokenizer。
使用字符串标记生成器,通常会有一个长字符串(即“parameter1; parameter2; parameter3”),其中连接了多个元素,并使用“标记”来分隔这些元素。 使用函数“String.split”,你基本上会说:“好的,给出这个字符串中的所有元素,但要考虑到这个字符';' 分离不同的元素“。 然后你得到“parameter1”,“parameter2”,“parameter3”。 你不关心分隔符。
但是在像你这样的数学表达式中:“a + bc * d / e”,你想获得所有单独的元素(操作数和运算符)。 这里没有明确的分隔符,顺序对您也很重要。 我会使用解析器库并编写一个小语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.