gpt4 book ai didi

c# - 流式结构化文本输入

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:35 24 4
gpt4 key购买 nike

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

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

举一个具体的例子,假设我有一个 TextReader 并且我知道下一个值应该是一个 double - 我如何提取那个 double 并且可能是一个有限的无需读取整个流且无需手动编写可本地化的双重解析器的前瞻量?

类似问题

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

最佳答案

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

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

关于c# - 流式结构化文本输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com