解析数字列表的最佳方法

时间:2011-09-13 16:58:08

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

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

第1,2和3项

第2至5项

第1至20项

第4或第8项

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

3 个答案:

答案 0 :(得分:1)

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

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 ++中编写类似的解析器。编写和调试这样的解析器比使用正则表达式更简单,更简单,并且在创建解析规则和语义操作方面也有很大的灵活性。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

为每个案例使用正则表达式为这些字符串编写解析器似乎非常简单,或者为每个字符串使用替代语言编写单个表达式。您需要使用\d+之类的内容来匹配数字。我也会对每组类似的组合器进行分组(比如 “和”/“或”和“到”/“通过”)成为一个替代方案,以便更容易处理结果。