2

TextReaderフォーマットされた基本値といくつかのカスタム文字列を-基本的にallowsのように解析したいと思いscanfます。

  • 私の入力には改行がない可能性があるため、ReadLine+Regexはオプションではありません。テキスト入力をチャンク化する他の方法を使用できます。しかし、問題は、コンパイル時に区切り文字がわからないこと(つまり、注意が必要です)と、その区切り文字がローカリゼーションに依存している可能性があることです。たとえば、floatの後にコンマが続く場合は「1.5」または「1,5」になりますが、どちらの場合も、floatを解析しようとすると「貪欲」になります。
  • 安全のために、私の入力は積極的に敵対的であると仮定したいと思います(たとえば、ネットワークストリームからのストリーミング)。つまり、チャンク区切り文字が意図的に欠落しています。
  • カスタム正規表現を避けたい:int.Parseとdouble.Parseはうまく機能し、ローカリゼーションに対応しています。DateTimeを使い始めないでください-とにかくいくつかのカスタムパターンが必要かもしれませんが、そのシナリオをカバーするために正規表現を書くのは面白そうに聞こえません。

具体的な例として、私がaを持っていTextReaderて、次の値が-であることを知っているとしましょうdouble-ストリーム全体を読み取ったり、ローカライズ可能なダブルパーサーを手動で書き込んだりせずに、その二重の、場合によっては限られた量の先読みを抽出するにはどうすればよいですか?

同様の質問

以前の質問「C#に相当するものを探してscanfいます」は似ているように聞こえますが、Q +Aはreadline+regexに焦点を当てています(これは避けたいです)。TextReaderに対してRegexを使用するにはどうすればよいですか?(チャンクを超えて)答えが見つかりませんでした。いずれにせよ、自分の正規表現を作成することは避けたいと思います。

4

1 に答える 1

1

その答えの欠如に基づいて、まだ自分で何も見つけていないので、

  • .NET でストリーム (または TextReaders) から直接ローカライズされた解析を使用する手段はありません。また、体系的な方法で解析可能なプレフィックスに対応するストリームの量を知る方法もありません。
  • .NET のストリーム (または TextReader) に正規表現を適用する手段がないため、このようなものを自分で簡単に実装する方法はありません。
  • このようなものが本当に必要な場合、最も簡単なオプションは本格的なパーサー ジェネレーターです。ANTLR はこれに適しています。基本をコピーして貼り付けることができる多くの既存の文法があり、文法を理解するのに役立つGUIが付属しており、.NET、Java、C、および他の多くの言語のパーサーを作成します. 開発者にとって使いやすく、高速です... ...しかし、私が必要とするものにはあまりにも強力で柔軟です。ショットガンでバグを撃つような - 私はこの解決策に興奮していません.
于 2010-03-01T16:11:19.140 に答える