流式结构化文本输入

时间:2010-02-12 09:54:00

标签: c# parsing scanf

我想从TextReader解析格式化的基本值和一些自定义字符串 - 基本上像scanf允许的那样。

  • 我的输入可能没有换行符,因此ReadLine + Regex不是一个选项。我可以使用其他一些分块文本输入的方式;但问题是我在编译时不知道分隔符(这很棘手),并且分隔符可能与本地化有关。例如,后跟逗号的float可能是“1.5”或“1,5”,但在这两种情况下,试图解析float都应该是“贪婪的”。
  • 为了安全起见,我想假设我的输入是主动的(例如,从网络流中流入):即故意丢失分块分隔符。
  • 我想避免使用自定义Regex:int.Parse和double.Parse运行良好,并且具有本地化感知功能。不要让我开始使用DateTime - 无论如何我可能需要一些自定义模式,但编写正则表达式来覆盖这种情况听起来并不好玩。

对于一个具体的例子,假设我有一个TextReader并且我知道下一个值应该是double - 如何在不阅读的情况下提取该双倍且可能有限量的前瞻整个流并没有手动编写可本地化的双解析器?

类似问题

之前的问题“Looking for C# equivalent of scanf”听起来很相似,但Q + A专注于readline + regex(我想避免)。 How can I use Regex against a TextReader?没有找到答案(超出分块),无论如何我都想避免编写自己的正则表达式。

1 个答案:

答案 0 :(得分:1)

基于缺乏答案但仍然没有找到任何东西,似乎

  • 无法直接从.NET中的Streams(或TextReaders)使用本地化解析,也无法通过系统方式知道流中有多少流对应于可解析前缀。
  • 没有办法在.NET中将正则表达式应用于Streams(或TextReaders),因此没有简单的方法可以自己实现这样的东西。
  • 如果你真的需要这样的东西,最简单的选择是一个成熟的解析器生成器。 ANTLR适用于此;它有很多现有的语法,你可以复制粘贴基础知识,它附带一个GUI来帮助理解你的语法,并为.NET,java,C和许多其他语言提供解析器。它是开发人员友好,快速......但是对于我需要的东西来说太强大和灵活;比如用霰弹枪射击一个小虫 - 我对此解决方案并不感到兴奋。