数式を正規表現と一致させるには?質問する

数式を正規表現と一致させるには?質問する

たとえば、次の数式は有効です。

a * b + c
-a * (b / 1.50)
(apple + (-0.5)) * (boy - 1)

これらは無効な数式です:

--a *+ b @ 1.5.0  // two consecutive signs, two consecutive operators, invalid operator, invalid number
-a * b + 1)  // unmatched parentheses
a) * (b + c) / (d  // unmatched parentheses

浮動小数点数の一致には問題ありませんが、括弧の一致には問題があります。何かアイデアはありますか? 正規表現よりも優れた解決策があれば、それも受け入れます。ただし、正規表現が推奨されます。

========

編集:

同じ疑問を持ってこのスレッドを見つけた人が誤解されないことを願って、私が選んだ「受け入れられた回答」についていくつかコメントしたいと思います。

「受け入れられた」と思う回答はいくつかありますが、どれがベストなのかわかりません。そこで、(ほぼ)ランダムに受け入れられた回答を選びました。受け入れられた回答の他に、Guillaume Malartre の回答も読むことをお勧めします。それらはすべて、私の質問に対する実用的な解決策を示しています。やや厳密で理論的な回答については、受け入れられた回答の下にある David Thornley のコメントをお読みください。彼が述べたように、Perl の正規表現の拡張(正規言語に由来)により、正規表現は「不規則」になります。(私は質問で言語について何も言及しなかったため、ほとんどの回答者は、おそらく最も人気のある実装である Perl の正規表現実装を想定しました。質問を投稿したときも、私はそう考えました。)

上記で何か間違ったことを言っていたら訂正してください。

ベストアンサー1

正規表現は正規言語を認識するためにのみ使用できます。数式の言語は正規ではありません。これを行うには、実際のパーサー (LR など) を実装する必要があります。

おすすめ記事