1

这是我所做的:

    while (sc.hasNext()) {
        String sLine = sc.nextLine();
        sLine.replaceAll("\\s", "");
        String[] scanned = sLine.split("");

我的输入将是这样的:

IF (2 -2 +) (3 2 *) (-1 4 +) (5 3 *)

这意味着什么是无关紧要的,但扫描仪所做的是首先将其“按原样”存储在字符串中。然后我使用 replaceAll 函数删除所有空格。然后我剩下:

IF(2-2+)(32*)(-14+)(53*)

然后,我使用 java 解释此代码并在没有发生错误的情况下执行计算。我现在的问题是,当我将字符串拆分为标记时,它将使每个“减号”标记自己的标记,但我想以某种方式将它与它后面的整数相关联,以便标记仍然只是一个整数(现在为负) 并且没有带有减号的标记。有没有简单的方法来做这样的事情?

4

3 回答 3

2

您可以使用在前面没有的negative look-behind拆分:-empty stringhyphen

str.split("(?<!-)");

这不会在-and之间的空字符串上拆分2,从而使它们保持完整。

String str = "IF(2-2+)(32*)(-14+)(53*)";
String[] arr = str.split("(?<!-)");
System.out.println(Arrays.toString(arr));

输出: -

[, I, F, (, 2, -2, +, ), (, 3, 2, *, ), (, -1, 4, +, ), (, 5, 3, *, )]

现在你有-2and-1而不是-作为单独的元素。

于 2013-01-30T06:24:27.010 回答
1

好吧,您将字符串按“”分开。我相信你想要做的是使用正则表达式来分割你想要的字符串。如果您不熟悉 Java 正则表达式,请参阅此内容以熟悉它。我建议低头查看特殊构造(非捕获)部分。

暗示

String[] scanned = sLine.split("your regex");
于 2013-01-30T06:28:07.057 回答
0

您为这项工作使用了错误的工具。您需要一个扫描仪和一个单独的解析器。一元减号由解析器处理,而不是扫描仪。看看递归下降表达式解析器、Dijkstra 调车场算法等。

于 2013-01-30T07:29:27.570 回答