Java 如何将字符串拆分为每个字符的字符串数组,同时将“;减;用后面的整数签名?

Java 如何将字符串拆分为每个字符的字符串数组,同时将“;减;用后面的整数签名?,java,split,Java,Split,以下是我所做的: while (sc.hasNext()) { String sLine = sc.nextLine(); sLine.replaceAll("\\s", ""); String[] scanned = sLine.split(""); 我的输入是这样的: IF (2 -2 +) (3 2 *) (-1 4 +) (5 3 *) 这意味着什么是无关紧要的,但扫描器所做的是将其存储在字符串“原样”中,首先。然后我使用rep

以下是我所做的:

    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解释此代码,如果没有错误发生,则执行计算。我现在的问题是,当我将字符串拆分为标记时,它将使每个“减号”都成为自己的标记,但我想以某种方式将其与后面的整数联系起来,这样标记仍然是一个整数(现在是负数),并且没有带减号的标记。有没有一种简单的方法可以做到这一点?

您可以使用
反向查找
来拆分
空字符串
,前面没有
连字符
:-

str.split("(?<!-)");
输出:-

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

现在您有了
-2
-1
而不是将
-
作为单独的元素。

那么您将字符串按“”拆分。我相信您要做的是使用正则表达式按照您想要的方式拆分字符串。如果您不熟悉Java正则表达式,请尝试熟悉它。 我建议往下看特殊构造(非捕获)部分

暗示


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

不错!Jain你能解释一下什么是“(?@GilPeretz..
”(?代表
反向查找
)。当用作
(?)时,它与
中的某个字符匹配“
前面没有
-
@GilPeretz.。你可以在这里了解更多关于它们的信息-好吧,我很希望这能起作用,但事实并非如此。我认为当它将令牌存储在字符串数组中时,它会忽略你放在括号中的符号。因此,我的数组不是以空格开头的,”(”,或“我”按预期使用此方法。@TheRationalist..我不明白。你能发布你的输入和预期的输出吗?你得到的确切输出是什么?不捕获是什么意思?很抱歉,响应太晚了,我最近几天不在计算机旁。总之,“不捕获”正则表达式基本上允许我们向后检查(即“-”号)并允许我们在一组字符上测试多次重复。
[, I, F, (, 2, -2, +, ), (, 3, 2, *, ), (, -1, 4, +, ), (, 5, 3, *, )]
String[] scanned = sLine.split("your regex");