【发布时间】:2014-05-19 01:14:23
【问题描述】:
将这些字符串映射到函数的最有效方法是哈希表:
std::string a="/foo/", b="/foo/car/", c="/foo/car/can/", d="/foo/car/haz/";
不幸的是,当您想要匹配最简单的模式时,事情变得更加复杂:
/foo/[a-Z|0-9]+>/
/foo/[a-Z|0-9]+>/bar/[a-Z|0-9]+/
有人告诉我,<regex> 库对我的需求来说太过分了;而且它的开销是相当大的。
在这里使用哈希表 (std::unordered_map) 可能是一个有效的选择; [a-Z|0-9]+ 在开关/案例中的单个解析中被检查。参数的数量(在 / 上拆分)并使用 / 的数量,然后使用任意数量的参数来决定采用哪条路径:
"/foo/" => {<function>, "/foo/can/", "/foo/[a-Z|0-9]+/bar/"}
"/foo/xflkjkjc34v" => {<function>, "/foo/can/", "/foo/[a-Z|0-9]+/bar/"}
"/foo/can" => {<function>, "/foo/can/", "/foo/[a-Z|0-9]+/bar/"}
"/foo/vxcvxc86vzxc/bar/" => {<function>, "/foo/[a-Z|0-9]+/bar/haz"}
有可能实现;但这是最好的方法吗?
【问题讨论】:
-
你只有两个箱子(有和没有栏)吗?你需要它有多高效?拆分方法有什么问题?
-
如果它实际上看起来像您的第二个代码块中的示例,您只需计算
/的数量。如果映射的函数不依赖于映射它的键(意味着只有两个函数,每个函数对应一个案例),那么您甚至不需要哈希表。 -
否;这些只是例子。在实践中会有更多的组合; RHS 支持数以万计的模式。编辑:我会将示例修改为更具体。
-
你打算写一个有几万例的开关吗?
-
我有一个解析实现输出哪些段(在
/上分区)在[a-Z]+[0-9]*范围内;并且在[0-9]+范围内。
标签: c++ regex c++11 string-matching unordered-map