1

假设我有一个字符串...
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"));


...也许它可以更短。当然,这不是确切的解决方案,但其余的现在只是一个装饰细节。

4

1 回答 1

0

根据您的解释,您的第一个案例听起来很简单。只需更换:

(\(\d*)

$1)

但是,这不会产生您想要的输出,而是会为您提供:

2*Math.sqrt(5265)+Math.sin(53)*2*Math.exp(3)+(5)+5)*3

阻止你(5+5)以这种方式转变的逻辑是什么?

也许您只想使用以 开头的函数来执行此操作Math.?在这种情况下,您可以尝试替换:

 (Math\.[a-z]+\(\d+)

$1)

但是不要运行它两次。没有什么能阻止这Math.pow(3)变成Math.pow(3))

要转换24Math.pow(3Math.pow(24,3),您可以替换:

(\d+)(Math.pow\()(\d+)

$2$1$3)
于 2013-04-12T00:48:26.180 回答