使用正则表达式在std地图中查找

时间:2013-06-22 17:56:06

标签: c++ regex boost stl

我想知道如何使用正则表达式函数在地图中查找项目。在我的情况下,我有一个带有en *,es *,en-AU等表达式的地图,我有一个像这样的可能值的字符串 -US,en-GB,es-CL等。

我想使用字符串进行搜索,以便在地图中找到该项目。 首先查找没有通配符的密钥,然后查找以通配符作为第二优先级的密钥。

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

1 个答案:

答案 0 :(得分:6)

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

否则:如果正则表达式仅用于某种​​类型的前缀搜索,则可以使用成员函数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查找具有该前缀的第一个条目。使用该前缀迭代所有条目,并测试正则表达式是否匹配。