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

时间:2013-04-11 18:55:16

标签: 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及以上示例的扩展版本。目前,我只使用单参数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,基本上由一个或多个字符串组成,形式如下......
{{1} },QWMath.[a-z](XWYQ[0-9]W之一,* - / +X。{{1} }和[0-9]都是可选的,其中QW是另一个Y字符串或Y,它使用A运算符连接到上一个字符串。

但似乎femtoRgon用[0-9]替换W的解决方案是正常的。

对于Math.pow部分:除了(Math\.[a-z]+\(\d+)中遗漏$1)之外,用(\d+)(Math.pow\()(\d+)替换$2$1$3)的femtoRgon解决方案也没问题。它应为,,其次是$2$1$3)方法,我必须添加附加反斜杠:$2$1,$3),与replace相同...

所以最后我觉得做这样的事情已经足够了......

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


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

1 个答案:

答案 0 :(得分:0)

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

(\(\d*)

$1)

但是,这不会产生您想要的输出,但是insteead会给你:

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(3中的Math.pow(24,3),您可以替换:

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

$2$1$3)