【问题标题】:String.replace() returns unwanted stringString.replace() 返回不需要的字符串
【发布时间】:2017-09-28 22:08:40
【问题描述】:

我正在编写一段代码,我必须将一个字符串拆分成单独的部分并替换它们。 我的代码的基本逻辑流程是,有一个包含公式的字符串。 LHS 下面的数字,即 1、2 和 3 是不同对象的 id。拆分它们后,我将使用这些 id,获取相应的值并将下面字符串中的 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)&gt;100,其中 30、45 和 50 是各自的值。 (这个字符串随后将在 SpEL 中用于计算公式)

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

初始字符串-

(1+2+3)&gt;100 其中 1、2 和 3 是 ID。 id 的值分别为 30.0、45.0 和 50.0。

使用for循环替换值后,字符串为-

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

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

我希望这部分很清楚。

【问题讨论】:

  • 一种方法是先用字母替换 ids(例如:A 代表 1,B 代表 2)然后分两步替换而不是一步替换

标签: java string replace spring-el


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多