我正在研究一个代码,在该代码中,我将字符串分为单个部分。我代码的基本逻辑流是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,并且可能存在一些重大差异,因此请确保您检查该版本的文档。