假设我有一个字符串...
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,其中Qis [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"));
...也许它可以更短。当然,这不是确切的解决方案,但其余的现在只是一个装饰细节。