c++ - 使用正则表达式在标准映射中查找

标签 c++ regex boost stl

我想知道如何使用正则表达式函数在 map 中查找项目。在我的例子中,我有一个包含 en*、es*、en-AU 等表达式的 ma​​p,并且我有一个可能值的 string,例如 en、en -US、en-GB、es-CL 等。

我想使用该字符串 进行搜索以在 map 中找到该项目。 先找不带通配符的key,然后再找带通配符的key。

请帮我解决这个问题,或者如果这效率低下,或者如果有人有不同的方法,请告诉我另一种方法。我将 C++ 与 boost 和 STL 一起使用。

最佳答案

如果映射很小或者很少执行搜索,那么只需遍历映射并将每个键与正则表达式匹配。

否则:如果正则表达式 仅用于某种​​前缀搜索,您可以使用成员函数lower_bound 来高效地查找具有给定前缀的所有条目。例如,以下函数首先查找完全匹配的条目。如果不存在这样的条目,则该函数返回具有匹配前缀的所有条目的范围。

using items = std::map<std::string, item>;

auto lookup(const items& items, const std::string& key)
    -> std::pair<items::const_iterator, items::const_iterator>
{
    auto p = items.lower_bound(key);
    auto q = items.end();
    if (p != q && p->first == key) {
        return std::make_pair(p, std::next(p));
    } else {
        auto r = p;
        while (r != q && r->first.compare(0, key.size(), key) == 0) {
            ++r;
        }
        return std::make_pair(p, r);
    }
}

否则:如果您必须处理正则表达式通配符,那么您可以将这两种方法结合起来。首先搜索与成员函数find 完全匹配的条目。如果不存在这样的条目,则从正则表达式中提取常量前缀。前缀可以为空。使用成员函数 lower_bound 查找具有该前缀的第一个条目。遍历具有该前缀的所有条目并测试正则表达式是否匹配。

关于c++ - 使用正则表达式在标准映射中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253690/

相关文章:

c++ - 如何记录从源顶点到目的顶点的所有最短路径

c++ - 更改 C++ vector 的保留内存

c++将没有时区的postgres时间戳转换为time_t

c - 扩展正则表达式是否支持反向引用?

java - 正则表达式捕获可能存在或可能不存在的一组组

c++ - 制作rcssbase时增加错误

c++ - 有没有办法不等待 system() 命令完成? (在三)

c++ - const 成员堆栈与堆

php - 法语字符的正则表达式

c++ - std::for_each 忽略默认函数参数