-2

ネストされた括弧を含む文字列があります:

string commandLine = "position(1, random(1, random(1, 9)), random(3, 15))"

この文字列を次のルールで解釈したいと思います

CommandName(パラメータ 1、パラメータ 2、パラメータ 3)

どこ:

  • 「(」および「)」括弧は、コマンド名に関連付けられたパラメーターを示します
  • 「,」カンマで各パラメータを区切ります

このことから、まず、各コマンドに関連付けられた正しい開き括弧と閉じ括弧を決定する方法を考案する必要があると思います。

この質問に対する一番の答えから、正規表現を使用できないようです。では、このタスクにどのようにアプローチすればよいでしょうか。

編集:

考えた。

最初の左角かっこにヒットした後、「(」角かっこの数を数えます。その数は、「)」の後続のコレクション内の右角かっこのインデックスを示します。

私の言葉遣いは私を失望させますが、それが始まりだと思いますか?

position(1, random(1, random(1, 9)), random(3, 15))

Opening 1         2         3              4
Closing                          12              34
4

1 に答える 1

0

これには多くの方法があります。これが1つです:

[a-z]+\s*\([^()]+\)正規表現を使用するすべての出現に一致します。これは、パラメーターに他のコマンドが含まれていないコマンドのみに一致します。あなたの例では、これらは と にrandom(1, 9)なりrandom(3, 15)ます。

一致ごとに、結果を計算します (または、何が何であれ、メモリ内表現を生成します)。コマンド名を簡単に分離し、コンマで分割してパラメーターを区切ることができるため、これは難しくありません (パラメーターがコマンドではないことがわかっているため、ここで誤解析の可能性はありません)。

あいまいでないものをキーとして、結果を辞書に格納します。たとえば、パラメータが で始まるのは通常は違法であると仮定すると?、最初のステップの後、次の辞書になる可能性があります。

"?1" => [the result or representation of random(1, 9)]
"?2" => [the result or representation of random(3, 15)]

元の一致をプレースホルダー?1とに置き換え?2ます。これで、最も内側にネストされたコマンドが削除されました。必要に応じて辞書を参照して、手順を繰り返します。各反復により、最も内側のコマンドのセットが削除されます。

入力文字列が(いくつかの変換の対象になった後)フォームに縮小された?XXX場合、すべてが正常に解析され、最終結果は辞書に追加された最後のエントリになります(入力文字列をキーとして使用してそれを引き出すことができます)。正規表現が何にも一致せず、入力文字列がこの形式でない場合、元の入力に構文エラーがありました。

これは決して最も効率的なアルゴリズムではありませんが、高レベルでの実装は簡単で、面倒な文字単位の解析コードを記述する必要はありません。

于 2013-04-12T22:19:56.170 に答える