我正在处理一段代码,我要将字符串拆分成单独的部分。 我的代码的基本逻辑流程是,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那么它非常受欢迎。问题的基本逻辑是以粗体显示在问题的开头。
答案 0 :(得分:2)
如果你看一下split(String regex, int limit) (强调是我的):
如果在此字符串的开头存在正宽度匹配,则在结果数组的开头包含空的前导子字符串。
因此,您可以将0
指定为limit
param:
如果n为零,则模式将被应用尽可能多次,数组可以具有任何长度,尾随空字符串将被丢弃。
答案 1 :(得分:1)
如果你保持简单,你就可以使用正则表达式和字符串操作(如拆分和替换)的组合。
然而,在我看来,你最好用ANTLR编写一个简单的解析器。
查看in this GitHub repository和Parsing an arithmetic expression and building a tree from it in Java
编辑:我有一段时间没有使用过ANTLR - 它现在已经到了版本4,并且可能存在一些重大差异,因此请确保检查该版本的文档。