String.replace() returns 不需要的字符串
String.replace() returns unwanted string
我正在编写一段代码,我必须在其中将字符串拆分成单独的部分并替换它们。 我的代码的基本逻辑流程是,有一个包含公式的字符串。 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)>100
,其中 30、45 和 50 是相应的值。 (此字符串将在 SpEL 中用于计算公式)
在用值替换字符串时,我收到以下响应 -
初始字符串 -
(1+2+3)>100
其中 1、2 和 3 是 ID。 ids分别取值为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
不是适合这里工作的工具。
你要做的是tokenize输入的字符串,然后对token进行操作。您可以选择在末尾组合回一个字符串,但这取决于您打算对公式做什么。
例如,您想将字符串 "(1+2+3)>100"
分词到数组 ["(", "1", "+", "2", "+", "3", ")", ">", "100"]
中。这只是在数字和符号之间的每个边界上进行拆分的问题。
从这个表示中,用它们对应的值替换数组中的整个标记是一件简单的事情,例如找到具有值 "1"
的数组索引并将其替换为 "30.0"
,等等。然后您可以通过将数组中的所有部分重新组合在一起来创建一个新的表达式字符串。
如果你想更进一步,你可以翻译成一个表达式树,它看起来像这样:
OpGreaterThan
OpPlus
Symbol(1)
OpPlus
Symbol(2)
Symbol(3)
Literal(100)
这棵树是通过将输入表达式(以标准中缀表示法呈现)转换为反向波兰表示法,然后构建一棵树,其中每个节点都是一个运算符,其子节点是操作数而形成的。这将允许您以符号方式操作 and/or 计算公式。
我正在编写一段代码,我必须在其中将字符串拆分成单独的部分并替换它们。 我的代码的基本逻辑流程是,有一个包含公式的字符串。 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)>100
,其中 30、45 和 50 是相应的值。 (此字符串将在 SpEL 中用于计算公式)
在用值替换字符串时,我收到以下响应 -
初始字符串 -
(1+2+3)>100
其中 1、2 和 3 是 ID。 ids分别取值为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
不是适合这里工作的工具。
你要做的是tokenize输入的字符串,然后对token进行操作。您可以选择在末尾组合回一个字符串,但这取决于您打算对公式做什么。
例如,您想将字符串 "(1+2+3)>100"
分词到数组 ["(", "1", "+", "2", "+", "3", ")", ">", "100"]
中。这只是在数字和符号之间的每个边界上进行拆分的问题。
从这个表示中,用它们对应的值替换数组中的整个标记是一件简单的事情,例如找到具有值 "1"
的数组索引并将其替换为 "30.0"
,等等。然后您可以通过将数组中的所有部分重新组合在一起来创建一个新的表达式字符串。
如果你想更进一步,你可以翻译成一个表达式树,它看起来像这样:
OpGreaterThan
OpPlus
Symbol(1)
OpPlus
Symbol(2)
Symbol(3)
Literal(100)
这棵树是通过将输入表达式(以标准中缀表示法呈现)转换为反向波兰表示法,然后构建一棵树,其中每个节点都是一个运算符,其子节点是操作数而形成的。这将允许您以符号方式操作 and/or 计算公式。