0

非常に単純な質問で、今日は私の脳が凍っているので、それが存在することを知っているエレガントな解決策を考えることはできません。

「A+B」の形式で渡される数式があります

また、数式変数を「読み取り可能な名前」にマッピングしています。

最後に、数式の値を計算する数式パーサーがありますが、変数の読み取り可能な名前で渡された場合に限ります。

たとえば、入力として私は

String formula = "A+B"
String readableA = "foovar1"
String readableB = "foovar2"

出力を「foovar1+foovar2」にしたい

単純な検索と置換の問題は、「読み取り可能な」名前が何であるかについての保証がないため、簡単に壊れてしまう可能性があることです。さまざまなパラメータを使用してもう一度例を見てみましょう

String formula = "A+B"
String readableA = "foovarBad1"
String readableB = "foovarAngry2"

ループ内で単純な検索と置換を行うと、既に置換した読み取り可能な名前の大文字のAとBを置換することになります。

これはおおよその解決策のように見えますが、変数を角かっこで囲んでいません

Java文字列のトークンのセットを置き換える方法は?

4

5 に答える 5

3

パターンを使用したマッチングが進むべき道であるため、提供したリンクは優れたソースです。ここでの基本的な考え方は、最初にマッチャーを使用してトークンを取得することです。この後、演算子とオペランドがあります

次に、各Operandで個別に置換を行います。

最後に、 Operatorsを使用してそれらを元に戻します。

于 2013-01-16T18:24:16.607 に答える
0
  1. やや面倒な解決策は、AとBのすべての出現箇所をスキャンし、文字列内のそれらのインデックスを記録してから、StringBuilder.replace(int start、int end、String str)メソッドを使用することです。(単純な形式では、これはあまり効率的ではありませんが、2乗の複雑さ、より正確には「変数の数」*「可能な置換の数」のようにsmthに近づきます)

  2. すべての演算子を知っている場合は、それらを分割して( "+"のように)、配列内の個々の"A"と"B"(もちろん最初に空白文字のトリミングを行う必要があります)を置き換えることができます。配列リスト。

于 2013-01-16T18:25:11.550 に答える
0

それを行う簡単な方法は

String foumula = "A+B".replaceAll("\\bA\\b", readableA)
                      .replaceAll("\\bB\\b", readableB);
于 2013-01-16T18:26:37.103 に答える
0

マッチングのみ

置換後に式を評価する必要がない場合は、正規表現を使用できる場合があります。何かのようなもの(\b\p{Alpha}\p{Alnum}*\b)

またはJava文字列"(\\b\\p{Alpha}\\p{Alnum}*\\b)"

次に、何度も使用find()してすべての変数を見つけ、それらの場所を保存します。

最後に、場所を調べて、古い文字列から変数ビットを置き換えて新しい文字列を作成します。

提供された式が妥当であることをあまりチェックしないわけではありません。たとえば、あなたがそれを与えて)A 2 B(A と B を置き換えるだけならまったく問題ありません ( のように)XXX 2 XXX()。それが重要かどうかはわかりません。

これは、質問で提供したリンクと似ていますが、使用した正規表現とは異なる正規表現が必要です。http://www.regexplanet.com/advanced/java/index.htmlにアクセスして、正規表現を試してみて、うまくいくものを見つけてください。私が提案したものと一緒に使用したところ、A + BとA +(C * D)で必要なものがうまく見つかりました。

解析中

利用可能なパーサー ジェネレーター (Antlr または Sable または ...) のいずれかを使用して式を解析するか、オープン ソースとして利用可能な代数式パーサーを見つけて使用します。(それらを見つけるにはウェブを検索する必要があります。私は使用していませんが、存在すると思われます。)

次に、パーサーを使用して式の解析された形式を生成し、変数を置き換えて、文字列形式を新しい変数で再構成します。

この方がうまくいくかもしれませんが、労力の量は、使用する既存のコードを見つけることができるかどうかによって異なります。

また、通常のルールに従って式が有効であることを検証する必要があるかどうかによっても異なります。ほとんどの場合、このメソッドは無効な式を受け入れません。

于 2013-01-17T15:57:34.633 に答える
0


あなたのアプローチは、式(数式)を式構造(式ツリーなど)に解析する必要があるという方法ではうまく機能しません。

後でオペランドノードとオペレーターノードがあるようにします。
後でこの式は、ツリーをたどり、数学的優先順位規則を考慮して評価されます。

Expression parsing の詳細を読むことをお勧めします。

于 2013-01-16T18:28:01.993 に答える