【问题标题】:Best way to parse a list of numbers解析数字列表的最佳方法
【发布时间】:2011-09-13 16:58:08
【问题描述】:

我有一个问题,我需要处理一个数字列表,这将是一个英文句子。它可以是以下格式:

项目 1、2 和 3

项目 2 到 5

项目 1 到 20

第 4 或 8 项

我最初的直觉是写一个简单的状态机来解析它,但我想知道是否有更好(更简单)的方法,比如一些正则表达式。有什么建议吗?

【问题讨论】:

  • 顺便说一句,正则表达式是状态机的表示:)
  • 2 and 32 or 3有区别吗?
  • 没有区别,他们应该使用“或”,但有时他们使用“和”。
  • 呸,我做了一个 C++ 答案,但如果分隔符后面没有空格,它会失败,所以“1,2,3”会失败。
  • 我认为一般不会有任何列表项之间没有空格。

标签: java c++ regex parsing text-processing


【解决方案1】:

如果你有 C++11,下面的解析器 (AXE) 会解析你所有的格式(我没有测试过):

unsigned i;
auto num = axe::r_unsigned(i);
auto space = axe::r_any(" \t");
auto format1 = num % (*space & ',' & *space) & ~("and" & +space & num);
auto format2 = num & +space & "through" & +space & num;
auto format3 = num & +space & "to" & +space & num;
auto format4 = num & +space & "or" & +space & num;
auto format = "items" & +space & (format1 | format2 | format3 | format4);

如果您没有 C++11,您可以使用 boost::spirit 在 C++ 中编写类似的解析器。编写和调试这样的解析器比使用正则表达式更容易、更短,而且您在创建解析规则和语义操作方面也有很大的灵活性。

【讨论】:

  • 哇,我需要学习 C++11,这对我来说完全陌生。
【解决方案2】:

如果您喜欢 Java,请使用正则表达式功能。

http://download.oracle.com/javase/tutorial/essential/regex/

但如果不是,sed 脚本最适合简单的文本处理。

sed 's/\d{1,} /\1 /g' < file.txt

【讨论】:

  • 您也可以在 C++ 中使用正则表达式,它们包含在新版本的语言 (C++11) 中,并且它们可作为前一版本的单独库(例如 Boost.Regex)使用.另一方面,在 C++ 中我可能只写一个小解析器,一点也不难。
  • Regex 库实际上是几年前在 TR1 中引入的。
【解决方案3】:

为这些字符串编写一个解析器似乎非常简单,对每种情况使用正则表达式,或者为每种情况使用一个单独的表达式。您需要使用 \d+ 之类的东西来匹配数字。我还将对每组相似的组合器进行分组(例如 "and"/"or" 和 "to"/"through") 合并为一个备选方案,以便更轻松地处理结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多