String.replace()返回不需要的字符串

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

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

我用以下代码分割字符串 –

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

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

在用值替换字符串时,我得到以下响应 –

初始字符串 –

(1+2+3)>100其中1,2和3是id。 ID的各自值分别为30.0,45.0和50.0。

使用for循环替换值后,字符串是 –

(50.00.0+45.0+50.0)>100 。 第一个值很奇怪。 原因是在第三次迭代中,字符串看起来像这样 – (30.0 + 45.0 + 3)> 100。 因此,在第三次迭代中替换字符串时,它将所有3的实例替换为50.0,从而产生上述字符串。 所以显然使用String.replace()在这里不是更好的选择。 那么在这种情况下我应该使用什么方法呢? 我也在使用SpEL,所以如果使用SpEL有更好的解决方案,那么它也很好。

这里, (1+2+3)>100只是一个例子。 圆括号是公式的一部分,字符串也可以是((1+2+3)*(5-2))>100 。 或者甚至可以改变公式的语法,目前公式是这样的 – (1 + 2 + 3)* 4> 100但是如果通过改变公式语法有一点出路那么这也会有帮助,例如将公式替换为 – ({#1} + {#2} + {#3})* {#4}> 100 ,在这种情况下,我将使用{#作为变量获取变量并获取数字。

我希望这部分是清楚的。

你是对的, String.replace不适合这里的工作。

你想要做的是标记输入字符串,然后对标记进行操作。 您可以选择在最后组合回一个字符串,但这取决于您打算如何处理公式。

例如,您希望将字符串"(1+2+3)>100"标记为数组["(", "1", "+", "2", "+", "3", ")", ">", "100"] 。 这只是在数字和符号之间的每个边界上分裂的问题。

从这种表示中,将数组中的整个标记替换为相应的值是一件简单的事情,例如,找到值为"1"的数组索引并将其替换为"30.0"等。然后,您可以创建一个新的表达式字符串只需将arrays中的所有部件连接在一起即可。

如果你想更进一步,你可以翻译成表达式树 ,它看起来像这样:

 OpGreaterThan OpPlus Symbol(1) OpPlus Symbol(2) Symbol(3) Literal(100) 

此树是通过将输入表达式(以标准中缀表示法呈现)转换为反向抛光表示法,然后构建树,其中每个节点是运算符,其子节点是操作数。 这将允许您象征性地操纵和/或评估公式。