我用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 :(得分:0)
根据您的问题和提到的输出,我会按照以下方式进行操作
( - 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也有效..当还有单词时。
但是,需要修剪。