Почему мое регулярное выражение работает JavaScript, но не в C ++? - PullRequest
0 голосов
/ 04 мая 2020

Предполагается, что мое регулярное выражение захватывает имена всех объявлений функций:

([\w{1}][\w_]+)(?=\(.+{)

В JavaScript работает как положено:

'int main() {\r\nfunctionCall();\r\nfunctionDeclaration() {}\r\n}'.match(/([\w{1}][\w_]+)(?=\(.+{)/g);
// [ 'main', 'functionDeclaration' ]

В C ++ Builder я получаю эту ошибку :

regex_error (error_badrepeat): одному из *? + {Не предшествовало допустимое регулярное выражение.

Минимальное Воспроизводимое Пример:

#include <iostream>
#include <regex>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<string> matches;
    string text = "int main() {\r\nfunctionCall();\r\nfunctionDeclaration() {}\r\n}";
    try {
        //regex myRegex("([\\w{1}][\\w_]+)(?=\\()"); works as intended
        regex myRegex("([\\w{1}][\\w_]+)(?=\\(.+{)"); // throws error
        sregex_iterator next(text.begin(), text.end(), myRegex);
        sregex_iterator end;
        while (next != end) {
            smatch match = *next;
            cout << match.str() << endl;
            next++;
        }
    } catch (regex_error &e) {
        cout << "([\\w{1}][\\w_]+)(?=\\(.+{)"
             << "\n"
             << e.what() << endl;
    }
}

Я использовал g ++ для компиляции выше, вместо C ++ Builder, и ошибка, которую он выдает, отличается: Unexpected character in brace expression.

1 Ответ

0 голосов
/ 04 мая 2020

Правильное регулярное выражение строковый литерал для C ++ таков:

"([\\w{1}][\\w_]+)(?=\\(.+\\{)"

В { необходимо экранировать, в отличие от JavaScript.

...