Прежде всего, вы не можете использовать 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;
}
