Как регулярное выражение квадратных скобок "[]" в C ++? - PullRequest
0 голосов
/ 11 февраля 2020

Вот регулярное выражение:

((([a-z])*Map|map)\\[((MapFields::([a-z]|[A-Z])*)|(([a-z]|[A-Z])*))|("([a-z]|[A-Z]|[0-9]|_)*")*\\]( )*=( )*([a-z]|[A-Z])*;)

и вот мои тесты:

  • map [MapFields :: abCd] = abCd;
  • myMap [ MapFields :: abCd] = abCd;
  • map [abCd] = AbCd;
  • map [AbCd] = abCd;
  • map [AbCd] = abCd;
  • myMap [AbCd] = abCd;
  • map ["AB123"] = abCd;
  • map ["AB_CD"] = abCd;
  • map ["AB_CD "] = abCd;

И это прекрасно работает здесь: https://regexr.com

Но, когда я пытаюсь проверить свои случаи с помощью регулярного выражения C ++ 11 .час. Я получаю недопустимые совпадения. Я понял, что из-за квадратных скобок мне нужно экранировать.

Вот код C ++,

    string data[10] = {
        //array of cases
    };

    try {
    regex rgx(regex string);

    for ( int i = 0 ; i < 10 ; i++ ) {
        if ( regex_match(data[i], rgx) ) {
            cout << "string literal matched\n";
        }
        else {
            cout << "string literal unmatched\n";
        }
    }
    }
    catch ( exception ex ) {
        cout << "Exception: " << ex.what() << endl;
    }

Как мне избежать квадратных скобок, чтобы мой код мог работать хорошо.

Спасибо:)

1 Ответ

0 голосов
/ 11 февраля 2020

После упрощения вы можете сделать:

int main()
{
    std::string data[] = {
        "map[MapFields::abCd] = abCd;",
        "myMap[MapFields::abCd] = abCd;",
        "map[abCd] = AbCd;",
        "map[AbCd] = abCd;",
        "map[AbCd] = abCd;",
        "myMap[AbCd] = abCd;",
        "map[\"AB123\"]=abCd;",
        "map[\"AB_CD\"]=abCd;",
        "map[\"AB_CD\"]=abCd;"
    };

    try {
        std::regex rgx(R"(((?:[a-z])*Map|map)\[(MapFields::[a-zA-Z]*|[a-zA-Z]*|"[a-zA-Z0-9_]*")\]\s*=\s*([a-zA-Z]*);)");

        for (const auto& s : data) {
            std::smatch res;
            if (std::regex_match(s, res, rgx) ) {
                std::cout << s << " [matched]\n";
                for (auto e : res) {
                    std::cout << e << std::endl; // Display matched groups
                }
            } else {
                std::cout << s << " [unmatched]\n";
            }
        }
    }
    catch (const std::exception& ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
    }
}

Демо

...