如何将字符串拆分为数组,但将多个数字/单词保持在一起?

时间:2016-02-14 01:33:35

标签: java regex string

我用Java编写一个简单的LISP解释器,我一直在弄清楚如何正确分割用户的输入,以便每个字符都在单独的索引上,除了多个数字和可能的单词。我还需要摆脱白色空间,这也会带来一些其他问题。

现在,我用来将用户输入分成字符串以便计算的行是:

String[] mainFunc = equation.replaceAll("\\s+", "").split("(?!^)");

Input: (+ 4 3)
Output: 
0) (
1) +
2) 4
3) 3
4) )

这适用于我需要的数字,直到2位或更多位数,因为它会将它们分成单独的索引。然后我尝试了另一个我在这里发现的正则表达式,它几乎照顾了我需要的东西,即:

String[] mainFunc = equation.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

Input: (- 10 3)
Output:
0) (- 
1) 10
2)  
3) 3
4) )

这几乎对我有用,但后来我需要拆分第一个括号和操作符,以及摆脱那个空白区域(我试着在一个循环中修剪而且我无法摆脱那个由于某种原因索引2中的空格。)

有关最佳方法的任何想法吗?

3 个答案:

答案 0 :(得分:0)

根据您的问题和提到的输出,我会按照以下方式进行操作

  • 所有内部元素都可以用空格分割( \\ s +
  • 因为对于第一个和最后一个括号,没有分裂术语。所以你必须将内部术语分开,如下所示
  

( - 10 3)至( - 10 3)

  • 现在所有元素都可以简单地按空格分割

这是我的代码

    String equation="(- 10 3)";
    equation=equation.replaceAll("\\(","\\( ");
    equation=equation.replaceAll("\\)"," \\)");
    String[] mainFunc = equation.split("\\s+");
    System.out.println(Arrays.toString(mainFunc));

输出

[(, -, 10, 3, )]

答案 1 :(得分:0)

拆分表达式消耗,所以你可以吃掉那里的空格。在空白或非数字/非空白之前/之后拆分:

printf_s

这适用于您的示例。

String[] mainFunc = equation.split("\\s+|(?<=[^ \\d])\\s*|\\s*(?=[()-])");

输出:

String equation = "(- 10 3)";
String[] mainFunc = equation.split("\\s+|(?<=[^ \\d])\\s*|\\s*(?=[^ \\d])");
Arrays.stream(mainFunc).forEach(System.out::println);

答案 2 :(得分:0)

哦..最后我得到了简单的答案..

String[] arr = a.split("(?=\\D)(?)");

而不是D,W也有效..当还有单词时。

但是,需要修剪。