我有一个问题,我需要处理一个数字列表,这将是一个英文句子。它可以采用以下格式:
第1,2和3项
第2至5项
第1至20项
第4或第8项
我最初的本能是编写一个简单的状态机来解析它,但我想知道是否有更好(更简单)的方式,例如可能是一些正则表达式。有什么建议吗?
答案 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+
之类的内容来匹配数字。我也会对每组类似的组合器进行分组(比如
“和”/“或”和“到”/“通过”)成为一个替代方案,以便更容易处理结果。