Необработанное исключение регулярного выражения C ++ (объект регулярного выражения ES) - PullRequest
0 голосов
/ 17 марта 2019

Я читал, что по умолчанию C ++ использует спецификации ES для создания объектов регулярных выражений.

Следующее регулярное выражение будет работать в javascript и соответствовать всему, что ограничено неэкранированными квадратными скобками:

std::regex (R"((?<=\[)(.*?)(?=\]))");

Новыдает необработанное исключение в C ++.

Что не так?

1 Ответ

0 голосов
/ 17 марта 2019

Прежде всего, вы не можете использовать lookbehind в шаблоне C ++ std::regex даже со стандартным вариантом регулярного выражения, потому что он основан на спецификациях ECMAScript, более старых, чем ECMAScript 2018, используемых в текущем браузере Chrome, где вы можете использовать lookbehinds с шаблонами неограниченной длины.

MSVC C ++ regex. Вкус ECMAScript еще более требователен к экранированию специального символа: символ ] ВСЕГДА должен быть экранирован.

Для извлечения подстрок внутри двух неэкранированных квадратных скобок, которые могут содержать escape-последовательности, вы можете использовать

std::regex reg(R"((?:^|[^\\])(?:\\{2})*\[([^\][\\]*(?:\\[\s\S][^\][\\]*)*)\])");

См. Демонстрационную версию regex . ПРИМЕЧАНИЕ : он не поддерживает вложенные неэкранированные квадратные скобки.

Подробности

  • (?:^|[^\\]) - группа без захвата
  • (?:\\{2})* - ноль или более повторений двойной обратной косой черты
  • \[ - [ char
  • ([^\][\\]*(?:\\[\s\S][^\]\[\\]*)*) - Группа 1:
    • [^\][\\]* - ноль или более символов, отличных от ], [ и \
    • (?:\\[\s\S][^\][\\]*)* - ноль или более повторений
      • \\[\s\S] - \ charс последующим любым символом
      • [^\][\\]* - ноль или более символов, отличных от ], [ и \
  • \] - ] char.

См. Демонстрационную версию C ++ :

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

int main() {
    std::regex reg(R"((?:^|[^\\])(?:\\{2})*\[([^\][\\]*(?:\\[\s\S][^\][\\]*)*)\])");
    std::string s("Some text [my \\[ value \\] here] and here");
    std::smatch matches;
    if (std::regex_search(s, matches, reg)) {
        std::cout<<matches.str(1);                 // => my \[ value \] here
    }
    return 0;
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...