2

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

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

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

类似问题

以前有一个问题“寻找 C# 等价物scanf”,这听起来很相似,但 Q+A 侧重于 readline+regex(我想避免)。如何对 TextReader 使用 Regex?没有找到答案(除了分块),无论如何我都想避免编写自己的正则表达式。

4

1 回答 1

1

基于缺乏答案并且我自己仍然没有找到任何东西,似乎

  • 没有办法直接从 .NET 中的 Streams(或 TextReaders)使用本地化解析,也没有办法以系统的方式知道有多少流对应于可解析的前缀。
  • 没有办法将正则表达式应用于 .NET 中的 Streams(或 TextReaders),因此没有简单的方法可以自己实现这样的东西。
  • 如果你真的需要这样的东西,最简单的选择是一个成熟的解析器生成器。ANTLR 可以很好地解决这个问题;它有很多现有的语法,你可以复制粘贴来获得基础知识,它带有一个 GUI 来帮助理解你的语法,并为 .NET、java、C 和许多其他语言制作解析器。它对开发人员友好,速度快......但对于我的需要来说太强大和灵活了;就像用霰弹枪打虫子一样——我对这个解决方案并不感兴趣。
于 2010-03-01T16:11:19.140 回答