0

私は現在、解析しなければならない特に不快な文字列形式に苦労しています。文字列には、解決する必要がある変数プロパティを示す部分文字列を含めることができます。のようなものを想像してみてください"ThisExampleStringContainsA[VARIABLE_PROPERTY]"。また、これらのプロパティは任意にネストすることができ、コンテキストに応じて異なる意味を持つこともできます。が実際に変数の有効な名前ではない場合[VARIABLE_PROPERTY](もちろん実行時に決定する必要があります)、それは文字列全体の通常の部分になり、変更されずそのまま残ります。次に、左角括弧の数が右角括弧の数と一致する必要がないため、無効な文字列はありません。This]Is[A[Valid]]][ExampleToo!. ルールは他にもありますが、これでアイデアが得られます。

そのため、現時点では、これにどのようにアプローチするかはわかりません。私の最初の試行は、if と else の信じられないほどの混乱で終わり、ソリューションには何らかの状態概念を適切に組み込む必要があることにますます気づきました。今、私はこれを行うためにオートマトンを使用することをますます考えています. しかし、私はオートマトンを純粋な理論的構築物としてしか見たことがありません。実際の実装に出くわしたことはありません。さらに、オートマトンは伝統的に単語を検証するために使用されます。つまり、正式に定義された言語に属しているかどうかを判断します。言うまでもなく、その言語を正式に定義することは私には困難です。

これにどのようにアプローチしますか?実際にオートマトンを実装することは健全なアプローチだと思いますか? オブジェクト指向設計の観点からこれをどのようにモデル化しますか? それが違いを生む場合、プロジェクトはC#にあります。まったく違うものを提案しますか?

/編集:私の説明は少し誤解を招く可能性があります。ここにいくつかの詳細があります:私にとっての問題は、プロパティを正しい順序(最も内側から最も外側へ)で見つけることです。解決する次のプロパティを特定したら、その最終値での実際の置換は比較的簡単です。

上記の例を取り上げて、何が起こるべきかを段階的に示します。完全な入力文字列は次This]Is[A[Valid]]][ExampleToo! のとおりです。最初の閉じ括弧と最後の開き括弧は、何も囲まれていないため、通常の文字です。同じことが、対応するブラケット ペアの間にないすべての文字にも当てはまります。残りは の部分[A[Valid]]]です。最も内側のプロパティを最初に解決する必要があります[Valid]。角かっこは、プロパティを識別する文字列を囲んでいるだけなので、Valid解決しようとしているプロパティの名前です。たとえば、この文字列は実際にはプロパティを識別し、実際の値に置き換えられますFoo。ブラケットを含む識別文字列が置き換えられるため、 に[Valid]なりFooます。今、私たちは見なければなりません[AFoo]]. AFooがプロパティを識別しないふりをしてみましょう。これにより、部分文字列は変更されません (括弧を含む)。最後に、2 番目の右括弧の後AFooに対応する左括弧がないため、これも単なる文字です。処理が完了すると、文字列全体が次のようになります。This]Is[AFoo]][ExampleToo!

この例が物事をもう少し明確にすることを願っています。ここでは文字列形式を簡略化していることに注意してください。これは、私がどのような困難に直面しているかを示すためのものです。問題にアプローチする方法についてのアイデアを提供してくれる答えを探しています。この解析は何千もの文字列に対して実行する必要があるため、ソリューションにはある程度妥当なパフォーマンスが必要です。

4

1 に答える 1

0

単純な古い再帰はどうですか?ここにぴったりのようです。

于 2010-10-07T13:48:00.750 に答える