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

时间:2017-05-01 13:37:50

标签: java string replace spring-el

我正在处理一段代码,我要将字符串拆分成单个部分并替换它们。 我的代码的基本逻辑流程是,有一个包含公式的字符串。 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是ids。 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&gt; 100 但是如果通过改变公式语法有一点出路然后这也有帮助,例如用 - ({#1} + {#2} + {#3})替换公式*  {#4}&gt; 100 ,在这种情况下,我会使用{#作为变量获取变量并获取数字。

我希望这部分是清楚的。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

如果您想更进一步,可以转换为表达式树,它看起来像这样:

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

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