String.split() returns 一个带有附加空值的数组

String.split() returns an array with an additional empty value

我正在编写一段代码,我必须在其中将字符串拆分成单独的部分。 我的代码的基本逻辑流程是,LHS 下方的数字,即 1、2 和 3 是对象的 ID。拆分它们后,我将使用这些 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];

因此,在拆分字符串后,我将用值替换字符串,即字符串现在是 (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那么它非常受欢迎。问题的基本逻辑写在问题的开头以粗体显示。

如果你看一下 split(String regex, int limit)(重点是我的):

When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array.

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

If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.

如果让事情变得非常简单,则可以结合使用正则表达式和字符串操作(如拆分和替换)。

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

看看Parsing an arithmetic expression and building a tree from it in Java and https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

编辑:我有一段时间没有使用 ANTLR - 现在是第 4 版,可能存在一些重大差异,因此请务必查看该版本的文档。