オブジェクトグラフの状態を保持しているカスタム文字列形式を解析したいと思います。これはASP.NETシナリオであり、クライアント(JavaScript)とサーバー(C#)で使いやすいものが必要でした。
私は次のようなフォーマットを持っています
{Name1|Value1|Value2|...|ValueN}{Name2|Value1|...}{...}{NameN|...}
この形式では、3つの区切り文字、、、、{
および}
があり|
ます。さらに、これらの文字は名前/値で考えられるため、非常に一般的な、などを使用してエスケープシーケンスを定義しました。これらは\
すべて、通常のバージョンとして解釈され、もちろんバックスラッシュです。すべてかなり標準的です。\{
\}
\|
\\
もともと私は正規表現を使用して、このようなオブジェクトの文字列表現を解析しようとしました(?<!\\)\{(.*?)(?<!\\)\}
。\
、、{
および}
はすべて正規表現で予約されていることに注意してください。{category|foo\}|bar\{}
もちろん、これにより、のようなものを正しく解析できるようになります。しかし、私はそれがのようなもので失敗することに気づきました{category|foo|bar\\}
。
(?<!(?<!\\)\\)\{(.*?)(?<!(?<!\\)\\)\}
これを試して、潜在的な無限の数のエスケープシーケンスを処理するために無限の数のネガティブルックビハインドが必要になることを考えると、このアプローチが不可能であることに気付くのに1分ほどかかりました。もちろん、1つまたは2つ以上のレベルがある可能性は低いので、おそらくハードコーディングすることができます。ただし、これは十分に一般的な問題であり、明確に定義された解決策が必要だと思います。
次のアプローチは、入力バッファーを実際にスキャンし、転送専用メソッドで各文字を消費する、定義済みのパーサーを作成することでした。私はまだこれを実際に終えていませんが、それは過度に複雑であるように思われ、私は明らかな何かを見逃しているに違いないと感じています。つまり、コンピューター言語がある限り、パーサーがあります。
だから私の質問は、可能なエスケープシーケンスでこのような入力バッファをデコードするための最も簡単で効率的でエレガントな方法は何ですか?