假设我有一个字符串...
2*Math.sqrt(5265+Math.sin(53*2*Math.exp(3+(5+5)*3
我想通过使用正则表达式来获取以下字符串...2*Math.sqrt(5265)+Math.sin(53)*2*Math.exp(3)+(5+5)*3
所以如果我是对的,我只需要插入)
一个字符串,就在一个未知长度的数字 [0-9] 和一个运算符之间,它可以是* - / +
.
此外,我想知道是否(如何?)可以获得支持Math.pow
以上示例的扩展版本。目前,我只使用单参数Math.*
方法,这对于上述尚未实现的解决方案是可以的。但是如果我想使用Math.pow
呢?
所以让我们说,例如,输入字符串是......
2*Math.sqrt(5265+Math.sin(53*2*Math.exp(3+(5+5)*3*24Math.pow(3*5*Math.sin(5
而我希望的输出看起来像......
2*Math.sqrt(5265)+Math.sin(53)*2*Math.exp(3)+(5+5)*3*Math.pow(24,3)*5*Math.sin(5)
(我在问,因为那时我想将编辑后的字符串传递给ScriptEngine
eval
.)
编辑
是的,对不起,我还没有说清楚。我实际上不在乎我是否得到*2*
,或者*(2)*
因为 ScriptEngine 的方法 eval 两者兼而有之,目前我无法想象这些形式有任何问题。
其次,我想为每个 operator 提供通用解决方案,* - / +
上面提到的字符串只是示例。我会尝试更具体。所以现在忽略第二Math.pow
部分,主字符串,我们称之为A
,基本上由一个或多个字符串组成,形式如下......
QWMath.[a-z](XWY
,其中Q
is [0-9]
,W
是其中之一* - / +
,X
再次是[0-9]
。QW
并且Y
都是可选的,其中Y
是另一个A
字符串或[0-9]
,它通过运算符连接到前一个字符串W
。
但看起来,femtoRgon 的解决方案替换(Math\.[a-z]+\(\d+)
为$1)
OK。
对于 Math.pow 部分:femtoRgon 的解决方案替换(\d+)(Math.pow\()(\d+)
为$2$1$3)
也很好,除了缺少,
. $2$1$3)
应该是$2$1,$3)
,其次,replace
我必须添加额外的反斜杠:(\\d+)(Math.pow\\()(\\d+)
,与
(Math\.[a-z]+\(\d+)
...
所以最后我似乎做这样的事情就足够了......
String evalString = "2*Math.sqrt(5265+Math.sin(53*2*Math.exp(3+(5+5)*3*2554Math.pow(451";
String firstPattern = "(\\d+)(Math.pow\\()(\\d+)";
String secondPattern = "(Math\\.[a-z]+\\(\\d+)";
String tempString = evalString.replaceAll(firstPattern, "$2$1,$3)");
System.out.println(tempString.replaceAll(secondPattern, "$1"));
...也许它可以更短。当然,这不是确切的解决方案,但其余的现在只是一个装饰细节。