0

% を mod 記号として使用する数学パーサーを使用しています。ユーザーが「25%*10」または「25% of 10」と入力して「2.5」という回答を受け取ることができるようにする代わりに、パーセント記号に使用したいと思います (何でも入力できます)。

次に、要求された正規表現を使用して「25%」(文字列の任意の部分にある可能性があります) を取得し、単純な計算 (25 / 100) を実行してから、文字列の 25% を計算された値に置き換えます。数学パーサーに渡します。基本的に、文字列全体を数学パーサーに渡す前に、パーセント記号の前の数値に対していくつかの事前計算を行っています。

私は常に正規表現に苦労しており、誰かが私を助けてくれることを望んでいました.

ありがとう

4

2 に答える 2

6

最も簡単な方法は、数学パーサーに除算を行わせることです。

s/([0-9.]+)%/($1\/100)/g

これは単に "25%" を "(25/100)" に置き換えるだけです ... したがって、ユーザーが " 25%*10" と入力すると " " が表示され(25/100)*10、これを評価すると正しい答えが得られます。

別の方法として、Perl では次のようにすることもできます。

s{([0-9.]+)%}{$1/100}eg

これは、Perl に 100 で割った値を計算させ、それを数学パーサーに渡します。

于 2009-04-19T07:09:16.997 に答える
1

「%」記号の前の数値を検索する正規表現は/(\d+)%/です。

ただし、数式は正規言語ではないため、正規表現は適切なツールではない可能性があります。代わりに、パーサーに '%' を「これより前にあるものをすべて取り、100 で割る」と解釈するように指示する必要があります。「これより前に来るものは何でも」は、任意の数式にすることができ、演算子の優先順位の問題に遭遇することはありません。構文ツリー パーサーでこれらを整理できます。

テキスト置換と実際の言語機能を混在させると、驚きを最小限に抑えるという原則に反することがよくあります。'%' が前にあるものを 100 で割り算していることに気付いたユーザーは、 のような式を使用しようとするかもしれません(23+42)%が、それは構文エラーを生成するだけです。また、 のようなものがある場合は、より精巧な正規表現が必要ですが1.34e-14%、これらはツリー パーサーを使用すると自動的に整理されます。

于 2009-04-19T14:10:42.163 に答える