我正在尝试创建一个能够在输入中缀表达式时遵循操作顺序的 Java 程序。为了简化输入,我决定最好使用 regex
表达式拆分整个字符串。我已经能够在 splitLine
数组中将除6 3
以外的所有内容拆分为它们自己的String
值。 我的SSCCE尝试如下:
String line = "6 + 5 + 6 3 + 18";
String regex = "(?<=[-+*/()])|(?=[-+*/()])"; //Not spitting 6 3 correctly
String[] splitLine = line.split(regex);
for (int i=0; i<splitLine.length; i++) {
System.out.println(splitLine[i]);
}
输出:
6
+
5
+
6 3 //Error here
+
18
预期输出:
6
+
5
+
6 //Notice
3 //these
+
18
我已经尝试并尝试修改我的正则表达式,但没有成功。谁能告诉我为什么我的正则表达式没有将6
和3
拆分为splitLine
数组中自己的Strings
?
编辑:只是想指出我这样做是为了好玩,这不是为了任何类型的学校工作等。我只是想看看我是否可以编写一个程序来执行简单的中缀表达式。我确实同意有更好的方法来做到这一点,如果表达式变得更加复杂,我会遇到一些问题。但不幸的是,这就是我的书建议我接近这一步的方式。
再次感谢所有快速评论和回答!
试试这个: (?<=[-+*/()])|(?=[-+*/()]|\s{2,})
您可以尝试在正则表达式中添加一个空格,当有 2 个或更多空格时,这也将拆分,因为在这种情况下,6 和 3 由空格分隔,6 3
也将分开。 如果匹配超过 2 个空格,此正则表达式将吐出字符串。您可以更改正则表达式中s{min,}
的最小空间数
以下正则表达式将匹配您当前的输入。
s(w+|[-+*/()])
要点是从列表中搜索空格,后跟单词或特定字符。
输出
6
+
5
+
6
3
+
18
也许你可以使用这样的东西吗?
String line = "6 + 5 + 6 3 + 18";
String regex = "(?<=[-+*/() ])|(?=[-+*/() ])"; //Added space to character class
String[] splitLine = line.split(regex);
for (int i=0; i<splitLine.length; i++) {
if (splitLine[i].trim().equals("")) // Check for blank elements
continue;
System.out.println(splitLine[i].trim());
}
或者你可以在(?<=\d)\s+(?=\d)
上拆分字符串以获得6 + 5 + 6
和3 + 18
。