たとえば、文字列があるとしましょう
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
ます。)
編集
はい、申し訳ありませんが、明確にしていません。ScriptEngine のメソッド eval が両方を取得するかどうかは、実際には気にしません。現時点では、これらのフォームで問題が発生することは想像できませ*2*
ん。第二に、すべての単一の operator で一般的な解決策を得たいと思います。上記の文字列は単なる例です。もっと具体的にしようと思います。したがって、2 番目の部分であるメイン文字列を無視して、それを と呼びましょう。基本的には、次のような形式の 1 つまたは複数の文字列で構成されています。とはどちらもオプションです。は別の文字列または*(2)*
* - / +
Math.pow
A
QWMath.[a-z](XWY
Q
[0-9]
W
* - / +
X
[0-9]
QW
Y
Y
A
[0-9]
、W
演算子で前の文字列に接続されます。
しかし、femtoRgon のソリューションの置き換え(Math\.[a-z]+\(\d+)
は$1)
問題ないようです。
Math.pow 部分の場合: femtoRgon のソリューションを に置き換え(\d+)(Math.pow\()(\d+)
て$2$1$3)
も問題ありませんが,
、$2$1$3)
. $2$1,$3)
2番目に、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"));
…もっと短くなるかもしれません。もちろん、それは正確な解決策ではありませんが、残りは単なる表面的な詳細です.