0

Javaでは、数式内の単位、つまり演算子の間にあるものに一致する正規表現を記述しようとしています

つまり、1 + [1 + 2] のような式では、正規表現は最初の 1 に一致し、次に [1 + 2] に一致する必要があります。

私が持っているのは *[([-+]?\d+(\.\d+)?)(\[.+\])] *

そのうち ([-+]?\d+(\.\d+)?) は任意の数に一致し、

(\[.+\])

かっこ内の何かに一致するはずですが、機能していません...何らかの理由で ']' や ' ' などに一致しています。

どんな助けでも素晴らしいでしょう:)

残念ながら、これは演習の一部であるため、基本的な Java ライブラリしか使用できません...これは、正規表現の演習でもあります。ここで基本的なものが欠けていますか?

4

4 に答える 4

3

正規表現と一致する括弧を見つけることができません。これは、通常の言語 (正規表現が表す数学オブジェクト) のポンピング レンマが、開始/終了の括弧が一致する言語に対して保持されないことの結果です。

少なくともコンテキストフリーのパーサーが必要です。それらはANTLRまたはJavaCCで構築できます。

于 2011-03-29T16:36:37.367 に答える
1

正規表現でこれを達成することはできません。算術式は、JavaCC や ANTLR などのツールを使用してパーサーを生成するために使用できる BNF 文法を使用して記述できます。

JavaCC を使用して実装した式パーサーを次に示します。

http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.sapphire/plugins/org.eclipse.sapphire.modeling/src/org/eclipse/sapphire/modeling/el/parser/internal/ExpressionLanguageParser. jj?view=markup&revision=1.6&root=Technology_Project

ソースは EPL です。その CVS の場所を見回すと、AST クラスと評価ロジックも見つかります。実装は、JSP/JSF 仕様用に定義された式言語から派生しています。

于 2011-03-29T16:37:33.093 に答える
0

他の回答者が述べたことを繰り返しますが(算術式の解析には正規表現では不十分です)、ANTLRよりもパーボイルドをお勧めします。

彼らはあなたが始めることができる電卓の例のセットさえ持っています.

于 2011-03-30T13:01:36.753 に答える
0

Apache License 2.0の条件の下で、 Dijkstra の Shunting Yardアルゴリズムに基づく式評価器をリリースしました。

http://projects.congrace.de/exp4j/index.html

于 2011-07-23T17:40:31.800 に答える