我正在尝试将算术方程字符串拆分为Java中的标记。这些等式还包括不等式符号!=,< =,> =,>和<。
例如。 (2 * 2 <= 5)应分为:
(, 2, *, 2, &lt; =, 5, )
现在,我的解决方案在之前和之后添加了空格在每个操作符之后然后用空格分隔它但是我在区分&lt; =和&lt;当我这样做的时候。我想,你需要一个正则表达式来检查&lt;之后是否有=或不是,但我似乎无法想出一个有效的。
我该怎么做呢?或者有更好的方法吗?
我现在做的是什么:
String[] tokens = expression
.replaceAll("\\+", " + ")
.replaceAll("\\^", " ^ ")
.replaceAll("^-", "-1*")
.replaceAll("-\\(", "-1*(")
.replaceAll("-", " -")
.replaceAll("\\*", " * ")
.replaceAll("/", " / ")
.replaceAll("!", " !")
.replaceAll(">", " >")
.replaceAll("<", " <")
.replaceAll("\\(", "( ")
.replaceAll("\\)", " )")
.split(" ");
答案 0 :(得分:1)
我是用StringTokenizer做的。输出
[(,2.0,*,2.0,&lt;,=,5.0,)]
由以下代码生成:
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader("(2*2<=5)"));
List<String> expression = new ArrayList<>();
try {
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
switch(tokenizer.ttype) {
case StreamTokenizer.TT_NUMBER:
expression.add(String.valueOf(tokenizer.nval));
break;
case StreamTokenizer.TT_WORD:
expression.add(tokenizer.sval);
break;
default: // operator
expression.add(String.valueOf((char) tokenizer.ttype));
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println( Arrays.toString(expression.toArray()));
如果您需要更多信息,请查看Java-API http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html
答案 1 :(得分:1)
检查以下解决方案是否对您有所帮助。
这里我假设输入是算术等式(不是任何其他字符串)并且仅包含整数,即2,而不是小数,即2.0。
private static void method(String str){
Pattern pattern1 = Pattern.compile("[^\\d]+");
Pattern pattern2 = Pattern.compile("[\\d]+");
Matcher matcher1 = pattern1.matcher(str);
Matcher matcher2 = pattern2.matcher(str);
List<String> list = new ArrayList<String>();
while(matcher1.find()){
list.add(matcher1.group(0));
if(matcher2.find()){
list.add(matcher2.group(0));
}
}
System.out.println("Token list is::");
for(String st:list){
System.out.print(st+",");
}
}
如果我将(2 * 2&lt; = 5)传递给上述方法,它将输出以下内容。
令牌列表是::
(,2,*,2,&LT; =,5,),