如何将运算符上的数学表达式拆分为分隔符,同时将它们保留在结果中



我需要拆分像这样的表达式

a+b-c*d/e 

分别得到abcde(作为字符串数组)和=-*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 = "a+b-c*d/e";

第三个问题:-

用String对象而不是数组对象初始化的字符串数组。

String[] result=new String();  // Should be `new String[size]`

事实上,您不需要提前初始化您的数组。

第四个问题:-

String.split以正则表达式作为参数,您已经传递了一个数组。不会起作用。

使用:-

String[] result = myString.split("[-+*/]");

对所有操作员进行拆分。


关于您的声明:-

以及=, -, *, d, /(也是一个运算符数组)。

我不明白你在这里想要什么。您的示例字符串不包含=。并且CCD_ 15不是CCD_。请查看是否要编辑。

更新:-

如果您想在数组中保留运算符,可以使用以下正则表达式:-

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]

我认为您想要做的更像是一个解析器,而不是一个标记化器。

使用字符串标记器,通常会有一个长字符串(即"parameter1;parameter2;parameter3"),其中包含多个串联的元素,并使用"标记"来分隔这些元素。对于函数"String.split",您基本上是在说:"好吧,给出这个字符串中的所有元素,但考虑到字符‘;’分隔不同的元素"。然后得到"parameter1"、"parameter2"one_answers"parameter3"。您不关心分隔符。

但在像你这样的数学表达式中:"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个ArrayListsSet。一旦你有了它,你就迭代你的字符串,检查集合是否包含给定的字符(从而确定它是否是一个运算符)。如果是,那么,你把它放在一个列表中,如果不是,你就把它放进另一个列表。

最后,您可以使用toArray(new String[arraySize])ArrayLists作为字符串数组返回。

最新更新