【问题标题】:Good practices for parsing user inputs with special characters?用特殊字符解析用户输入的好习惯?
【发布时间】:2011-07-05 21:29:08
【问题描述】:

大家好,我是反抗邪恶银河帝国的节目作者。现在,我们正准备对死星进行一次大胆的进攻。

我创建了一个庞大的信息数据库,其中包含我们即将袭击死星的 X 翼和 Y 翼战斗机上的飞行员、机器人和系统。由于我们迫切需要快速访问信息,我设计了一个系统,用户可以在其中输入一串文本来指定他们想要检索的数据。

用户可以搜索许多字段。例如,如果用户想查找有关 R2D2 的数据,他可以输入查询“DROID:R2D2”并快速找到该数据。如果他需要红队所有飞行员、机器人和系统的数据,他可以输入“TEAM:RED TEAM”。

但是,该系统旨在处理更复杂的查询。从前面的查询可以看出,数据字段名和数据值是用冒号:字符分隔的。用户必须能够搜索每个字段的多个值并一次搜索多个字段。

这是我的高级用户的典型查询: "SHIPTYPE:X-WING,Y-WING;位置:94 号坞站;DROIDTYPE:R2"

我对自己处理此事的方式感到非常满意。 我使用String.Split(';') 函数读取以获取用户选择的三个数据字段的值。我使用String.Split(':') to seperate the data field name from the value, and then I userString.Split(',')` 来获取用户输入多个字段的不同字段值。你可以看看它是如何工作的。

但是,有一个问题。莉亚公主(你知道她有多挑剔)坚持在她的爆破器校准记录中使用“:”、“;”和“,”。当她尝试查询这些数据时,我的程序无法理解她的查询。她说如果不纠正这个问题,死星很快就会摧毁叛军基地。

因此,我请求您帮助提出解析用户输入的良好做法。如何让我的程序为 Leiah 公主工作?

更新我将推测我自己问题的答案。当我学习用 C 风格的语言编程时,我了解了“转义序列”,我可以在其中指定字符串文字中通常保留的字符。 (例如,一个 " 字符通常终止一个字符串文字,但我可以使用 \" 来“转义”它)成为实现它的最佳方式。在准备这次死星袭击之前,我的大部分编程经验都是使用湿气蒸发器的二进制语言,所以这对我来说是新的。

【问题讨论】:

  • 翻译:“我使用分号、冒号和逗号作为分隔符 - 但有些值自然包含这些字符。我该如何解决这种情况?”对吗?
  • 这是我的问题。但是,我对这类编程问题没有太多经验,所以我想提前了解我正在做的事情。我对我在 SO 上提出问题的频率感到惊讶,结果证明这是一个错误的问题。
  • 感谢乔恩的翻译。那是我生命中的 5 分钟,我不会回来!
  • 起初我以为我不小心到达了SciFi-Stackexchange-Beta,直到我阅读了 Jons 的翻译评论。
  • 您可能对this SO questionaccepted answer 感兴趣。希望对您有所帮助。

标签: c# .net user-input string-parsing


【解决方案1】:

以与 Google 类似的方式,您可以允许将搜索词括在 " 标记中。因此您可以:

SHIPTYPE:"BATTLESTAR:GALACTICA";位置:坞站 94; DROIDTYPE:R2

【讨论】:

  • +1 @JonEgerton 简单、优雅,人们已经知道怎么做!
  • 为了实现这个解决方案,什么字符串解析方法最合适?
  • 我会调查使用 Regex.Split 作为一种可能性,尽管我不会假装知道正则表达式模式是什么。可能对另一个 SO 问题有好处!或者,我认为这取决于通过字符串并手动分解它的驴工作。就个人而言,我会考虑更改设计并使用下拉/复选框列表做一个简单的查询构建器。这样您就不会受到用户拼写错误的影响,并且用户不必确切知道一些更复杂的名称的语法。
  • 实际上,乔恩,有一个带有下拉/复选框列表的页面,正如您所建议的那样。我认为为高级用户提供一种更快的方式进行即时查询会很方便。
  • 如果查询包含"怎么办?
【解决方案2】:

很抱歉,《星球大战》的描述并没有帮助澄清您的问题。

无论如何,我已经写了很多解析代码。我不太关心String.Split(),除非数据总是这样格式化。 http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class 有一个通用解析器类。我可能会使用类似的东西来实现更灵活的解析器。

【讨论】:

    【解决方案3】:

    您似乎在分隔符左侧使用关键字,在分隔符右侧使用实际查询值。您可以尝试检查;: 之间包含的word 是否是实际关键字,并且此时是否忽略分隔符。

    但这并不简单,也不能单独使用String.Split()

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2017-07-16
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多