1

我正在尝试创建一个能够在输入中缀表达式时遵循操作顺序的 Java 程序。为了简化输入,我决定最好使用regex表达式拆分整个字符串。我已经能够将除 之外的所有内容拆分为数组中6 3自己的String值。splitLine我的 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

我已经尝试并尝试修改我的正则表达式并且没有成功。谁能告诉我为什么我的正则表达式没有在数组中将6and拆分3成他们自己的?StringssplitLine

编辑:只是想指出我这样做是为了好玩,不是为了任何学校作业等。我只是想看看我是否可以编写一个程序来执行简单的中缀表达式。我同意有更好的方法来做到这一点,如果表达式变得更复杂,我会遇到一些问题。但不幸的是,这就是我的书建议我处理这一步的方式。

再次感谢所有快速评论和回答!

4

3 回答 3

1

试试这个 :(?<=[-+*/()])|(?=[-+*/()]|\\s{2,})

您可以尝试在正则表达式中添加一个空格,当有 2 个或更多空格时也会拆分,因为在这种情况下 6 和 3 由空格分隔,6 3也将被分隔。如果匹配超过 2 个空格,此正则表达式将吐出字符串。\s{min,}您可以像在正则表达式中一样更改最小空间数

于 2013-09-30T05:18:56.227 回答
1

以下正则表达式将匹配您当前的输入。

\s(\w+|[-+*/()])

要点是从列表中搜索一个空格,后跟一个单词或特定字符。

输出

 6
 +
 5
 +
 6
 3
 +
 18
于 2013-09-30T05:19:54.073 回答
1

你可以使用类似的东西吗?

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)为 get6 + 5 + 63 + 18.

于 2013-09-30T05:21:59.510 回答