3

正規表現関数を使用してマップ内のアイテムを検索する方法を知りたいです。私の場合、en*、es*、en-AU などの式を含むマップがあり、en、en-US、en-GB、es-CL などの可能な値の文字列があります。

その文字列を使用して検索して、マップ内のそのアイテムを見つけたいです。最初にワイルドカードなしのキーを探し、次にワイルドカード付きのキーを 2 番目の優先度として探します。

この問題を解決してください。または、これが非効率的である場合、または別のアプローチを使用している場合は、別の方法を教えてください。私はブーストとstlでC ++を使用しています。

4

1 に答える 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);
    }
}

それ以外の場合:正規表現またはワイルドカードに対処する必要がある場合は、2 つのアプローチを組み合わせることができます。最初に、メンバー関数と完全に一致するエントリを検索しますfind。そのようなエントリが存在しない場合は、正規表現から定数プレフィックスを抽出します。プレフィックスは空である可能性があります。メンバー関数lower_boundを使用して、そのプレフィックスを持つ最初のエントリを見つけます。そのプレフィックスを持つすべてのエントリを繰り返し処理し、正規表現が一致するかどうかをテストします。

于 2013-06-22T20:23:56.723 に答える