2016-02-14 99 views
0

我正在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中的空间)。

关于如何去做这件事的最佳方式的任何想法?

回答

0

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

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); 

输出:

(
- 
10 
3 
) 
+0

非常感谢你,这正是我所需要的! – reekah

+0

@reekah我修改了正则表达式更一般的,例如处理其他操作符等 – Bohemian

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,)] 
0

oh..finally我有一个简单的答案..

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

,而不是d,W也适用..当有还的话。

但是,需要修剪。

相关问题