0

JavaScript 正規表現に問題があります。これは私の正規表現です:

(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+

この正規表現は、たとえばテキストが数学式であるかどうかをテストし、変数のように (18*19)/2追加できます。たとえば、次のようになります。QXXQ18/42+7*Q7

この正規表現は Java で完全に機能します ( http://fiddle.re/dnbh6でテストしました)。しかし、JavaScriptで変換しようとすると、うまくいきません...これは私が試したすべての解決策です:

var reg =/(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+/g;
reg.test("Q18+aaaa)//return true, but in java this is resturn false

var reg= new RegExp("(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+", "g");
reg.test("Q18+aaaa)//return true, but in java this is resturn false

だから、もしあなたがアイデアを持っていれば、私はそれを試してみます。

4

2 に答える 2

0

あなたがここでしていることは正しいかどうかはわかりませんが、あなたの問題が何であるかはわかっていると思います。

メソッドを使用している場合、Java ではmatches()正規表現を完全な文字列と照合します。

Javascript はそれを行っておらず、部分一致も返します。同じ動作を実現するには、正規表現の周りにアンカーを追加する必要があります。^文字列の先頭と一致し、文字$列の末尾と一致します。

したがって、次のようになります (巨大な正規表現を短縮しました!):

var reg= new RegExp("^(([\+\-\/\*\^]?)...([(]?value[)]?))[)]*))+$", "g");
  Added anchors ==>  ^                                          ^
于 2013-04-29T13:19:20.870 に答える