【问题标题】:How can I split a String into a String array for each character, while grouping a "minus" sign with the integer that follows it?如何将字符串拆分为每个字符的字符串数组,同时将“减号”符号与后面的整数分组?
【发布时间】:2013-01-30 06:19:51
【问题描述】:

这是我所做的:

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

【问题讨论】:

    标签: java split


    【解决方案1】:

    您可以使用negative look-behind 分割empty string 前面没有hyphen :-

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

    这不会在-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, *, )]
    

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

    【讨论】:

    • 不错! Jain 你能解释一下“(?
    • @GilPeretz..(?&lt;!..) 代表negative look-behind。当用作(?&lt;!-)"somecharacter" 时,它匹配一个字符串,其中"somecharacter" 前面没有-
    • @GilPeretz.. 你可以在这里了解更多信息 - perldoc.perl.org/…
    • 嗯,我寄予厚望,希望这会奏效,但它没有。我认为当它将标记存储在字符串数组中时,它会省略您放在括号中的符号。所以,我的数组不是以空格、'(' 或 'I' 开头,正如使用此方法所预期的那样。
    • @TheRationalist .. 我不明白。您可以发布您的输入和预期输出吗?你到底得到了什么输出?
    【解决方案2】:

    嗯,你用“”分割字符串。我相信你想要做的是使用正则表达式来分割你想要的字符串。如果您对 Java 正则表达式不熟悉,请see this 熟悉它。 我建议低头查看特殊构造(非捕获)部分。

    提示

    String[] scanned = sLine.split("your regex");
    

    【讨论】:

    • 不抓包是什么意思?
    • 很抱歉回复晚了,最近几天我不在电脑旁。无论如何,“非捕获”正则表达式基本上允许我们向后检查(即“-”符号)并允许我们测试一组字符的多次重复。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 2016-04-01
      • 2012-02-22
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多