在std map中使用正则表达式进行查找

3
我想知道如何使用正则表达式函数在地图中查找项目。在我的情况下,我有一个包含表达式(如en*,es*,en-AU等)的地图,以及可能值的字符串,如en,en-US,en-GB,es-CL等。
我想使用该字符串来搜索并在地图中找到该项目。首先查找没有通配符的键,然后将具有通配符的键作为第二优先级进行查找。
请帮我解决这个问题,如果这是低效的,或者如果有其他方法,请告诉我另一种方法。我使用C++和boost与stl。

你的意思是你想使用正则表达式搜索地图中的,还是你想搜索地图中的 - Some programmer dude
无论哪种方式,您都必须手动迭代所有键/值,并为每个键/值执行搜索。 - Some programmer dude
你好,欢迎来到Stack Overflow。您可能需要阅读“如何提问”FAQ,以帮助您提出问题,以便我们能够帮助您。 - kfsone
类似 en*es* 的表达式看起来像通配符,而不是正则表达式。相应的正则表达式应该是 ^en.*^es.* - Barmar
你所说的“map”是指std::map还是任何关联容器?是否需要一般通配符,还是只需要精确匹配的通配符模式?你能控制容器的定义吗?我们要处理多少条目——10、1000、100000、10000000、1000000000、还是更多? - Yakk - Adam Nevraumont
在映射中使用的类型需要一个明确定义的小于运算符。 "en *"是否小于"en-AU"? - brian beuning
1个回答

8
如果地图很小或搜索很少执行,则只需遍历地图并将每个键与正则表达式进行匹配。
否则:如果仅使用正则表达式进行某种前缀搜索,可以使用成员函数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查找具有该前缀的第一个条目。迭代遍历所有具有该前缀的条目并测试是否与正则表达式匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接