7

我需要拆分一个表达式

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);

但是,它显示一个错误。如何解决?

4

5 回答 5

23

第一个问题: -

多重声明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, /(也是一组运算符)分别。

我不明白你在这里想要什么。您的示例字符串不包含=. 并且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

于 2012-11-23T08:00:14.557 回答
4

除了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]
于 2012-11-23T08:11:57.050 回答
1

只是为了得到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);

编辑:删除了不需要的转义字符。

于 2012-11-23T08:03:52.570 回答
1

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

使用字符串标记器,您通常有一个长字符串(即“parameter1;parameter2;parameter3”),其中连接了几个元素,并使用“标记”来分隔这些元素。使用函数“String.split”,您基本上是在说:“好的,给出这个字符串中的所有元素,但要考虑到那个字符';' 分隔不同的元素”。然后你得到“parameter1”、“parameter2”、“parameter3”。你不关心分隔符。

但是在像您这样的数学表达式中:“a+bc*d/e”,您想要获取所有单个元素(操作数和运算符)。这里没有明确的分隔符,顺序对您也很重要。我会使用解析器库并编写一个小语法。

于 2012-11-23T08:39:19.753 回答
0

据我所知,你不能立即做你想做的事。split(String regex)不需要整个数组(与 C# 不同),只是一个表示有效正则表达式的字符串。

您可以做的是定义 aSet包含您的运算符和 2 ArrayLists。一旦你有了它,你迭代你的字符串,检查集合是否包含给定的字符(从而确定它是否是一个运算符)。如果是,那么,你把它放在一个列表中,如果不是,你把它放在另一个列表中。

最后,您可以使用toArray(new String\[arraySize\])来取回您的ArrayListsas String 数组。

于 2012-11-23T08:02:29.403 回答