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)