Java正则表达式在两个模式之间插入单个字符

Java正则表达式在两个模式之间插入单个字符,java,regex,Java,Regex,比如说我有一个字符串 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和以上示例。目前,我只使用单参

比如说我有一个字符串
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同时采用了这两种形式,目前我无法想象这些形式会有任何问题。
其次,我想用每个操作符得到一般的解决方案
*-/+
,上面提到的字符串只是示例。我将尝试更具体一些。所以现在忽略第二个
Math.pow
部分,即在字符串中,我们称它为
A
,基本上由一个或多个字符串组成,其形式如下…
QWMath.[A-z](XWY
,其中
Q
[0-9]
W
*-/+
之一,
X
又是
[0-9]

QW
Y
都是可选的,其中
Y
是另一个
A
字符串或
[0-9]
,它通过
W
运算符连接到上一个字符串。

但femtoRgon的解决方案似乎可以将
(数学\[a-z]+\(\d+)
替换为
$1)


对于Math.pow部分:femtoRgon的解决方案将
(\d+)(Math.pow\(\d+)
替换为
$2$1$3)
也很好,除了在
$2$1$3)
中缺少
之外。它应该是
$2$1,$3)
第二,使用
替换
方法,我必须添加传统的反斜杠:
(\\d+)\\\\\d+(Math.pow\\\\\\\(\\d+)
,与
(数学\[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"));


…也许可以短得多。当然,这不是确切的解决方案,但其余的只是一个装饰性的细节。

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

(\(\d*)

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

2*Math.sqrt(5265)+Math.sin(53)*2*Math.exp(3)+(5)+5)*3
什么逻辑会阻止您以这种方式转换
(5+5)

也许您只想使用从
数学开始的函数执行此操作。
?在这种情况下,您可以尝试替换:

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

但是不要运行两次。没有什么可以阻止它将
Math.pow(3)
更改为
Math.pow(3))

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

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


输入的形式是什么?您没有解释为什么要在某些运算符之前插入
,而不是在其他运算符之前插入,例如,
*2*
中的第二个星号。最后一行输出中Math.pow()参数的24应该来自哪里?是否所有的“pow”()都应该转换为“pow(24,)”?
$1)
(\d+)(Math.pow\()(\d+)
$2$1$3)