解析数字列表的最佳方法
Best way to parse a list of numbers
我有一个问题,我需要处理一个数字列表,这将是一个英语句子。可以是以下格式:
第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+
之类的东西来匹配这些数字。我还会对每组相似的组合子进行分组(如
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?