String.split()返回带有附加空值的数组



我正在研究一个代码,在该代码中,我将字符串分为单个部分。我代码的基本逻辑流是LHS上以下数字,即1、2和3是对象的ID。一旦我将它们拆分,我将使用这些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];

o,在拆分字符串后,我将用值替换字符串,即字符串现在是(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> 100 ,但是如果有办法通过更改公式语法的方法,则这也将很有帮助,例如 - ({#1} {#2} {#3}( *替换公式 {#4}> 100 ,在这种情况下,我将使用{#作为变量并获取数字。

我希望这部分很明确。

编辑3-

以防万一, SPEL也在我的项目中,尽管我对它没有太多想法,因此,如果使用Spel有更好的解决方案,那么它却非常欢迎。问题的基本逻辑是在问题开始时写的。

如果您查看拆分(字符串正则限制((强调是我的(

当该字符串开头有一个正差匹配时,则在结果数组的开头中包括一个空的前导子字符串。

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

如果n为零,则该模式将尽可能多次应用,数组可以具有任何长度,并且 tailling空字符串将被丢弃。。P>

如果您保持事物非常简单,则可以使用正则表达式和诸如split和替换的字符串操作的组合。

但是,在我看来,您最好使用ANTLR编写一个简单的解析器。

看一下解析算术表达式并在Java和https://theantlrguy.atlassian.net/wiki/wiki/display/display/antlr3/five minute mminute Introduction intlr toto to toto toto to antlr 3

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

最新更新