String.split()返回一个带有额外空值的数组

时间:2017-05-01 08:40:11

标签: java regex string spring-el

我正在处理一段代码,我要将字符串拆分成单独的部分。 我的代码的基本逻辑流程是,LHS下面的数字,即1,2和3是一个对象的ID。一旦我拆分它们,我就会使用这些ID,获取相应的值,并将下面String中的ID替换为各自的值。我所拥有的字符串如下 -

String str = "(1+2+3)>100";

我使用以下代码分割字符串 -

String[] arraySplit = str.split("\\>|\\<|\\=");
String[] finalArray = arraySplit[0].split("\\(|\\)|\\+|\\-|\\*");

现在我得到的数组就是这样 -

arraySplit = [(1+2+3), >100];
finalArray = [, 1, 2, 3];

因此,在分割字符串之后,我会用值替换字符串,即字符串现在是(20+45+50)>100,其中20,45和50是相应的值。 (此字符串将在SpEL中用于评估公式)

我快到了,只是我在第一个位置得到一个空元素。 有没有办法不在第二个数组中获取空​​元素,即finalArray对此进行一些研究,我猜它正在拆分字符串(1+2+3)和将空元素作为字符串的一部分。 如果这是事情,那么除了String.split()之外还有其他方法可以给我相同的结果吗?

编辑 -

这里,(1+2+3)>100只是一个例子。圆括号是公式的一部分,字符串也可以是((1+2+3)*(5-2))>100

编辑2 -

在拆分此字符串并对其执行一些代码之后,我可以在 SpEL 中使用此字符串。所以如果通过直接使用SpEL有更好的解决方案,那么它也会很棒。

另外,目前我正在使用公式的语法 - (1 + 2 + 3)* 4&gt; 100 但如果有一条出路通过改变公式语法一点然后这也有帮助,例如用 - ({#1} + {#2} + {#3})替换公式*  {#4}&gt; 100 ,在这种情况下,我会使用{#作为变量获取变量并获取数字。

我希望这部分是清楚的。

编辑3 -

以防万一, SpEL也在我的项目中,虽然我对它没有太多了解,所以如果有一个更好的解决方案使用SpEL那么它非常受欢迎。问题的基本逻辑是以粗体显示在问题的开头。

2 个答案:

答案 0 :(得分:2)

如果你看一下split(String regex, int limit) (强调是我的)

  

如果在此字符串的开头存在正宽度匹配,则在结果数组的开头包含空的前导子字符串。

因此,您可以将0指定为limit param:

  

如果n为零,则模式将被应用尽可能多次,数组可以具有任何长度,尾随空字符串将被丢弃

答案 1 :(得分:1)

如果你保持简单,你就可以使用正则表达式和字符串操作(如拆分和替换)的组合。

然而,在我看来,你最好用ANTLR编写一个简单的解析器。

查看in this GitHub repositoryParsing an arithmetic expression and building a tree from it in Java

编辑:我有一段时间没有使用过ANTLR - 它现在已经到了版本4,并且可能存在一些重大差异,因此请确保检查该版本的文档。