解析数字列表的最佳方法

Best way to parse a list of numbers

本文关键字:最佳 方法 列表 数字      更新时间:2023-10-16

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

第1、2、3项

项目2至5

项目1至20

第4或8项

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

如果你有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++中编写类似的解析器。与使用正则表达式相比,编写和调试这样的解析器更容易,时间更短,而且在创建解析规则和语义操作方面也有很大的灵活性。

如果你坚持使用Java,请使用正则表达式的功能。

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

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

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

为这些字符串编写解析器似乎非常简单,对每种情况使用一个正则表达式,或者为每种情况使用一个替代表达式。你需要用d+之类的东西来匹配这些数字。我还会对每组相似的组合子进行分组(如

将"/"或"and" to"/"through")合并为一个选项,以便更容易处理结果。