我已经读过,默认情况下C ++使用ES规范来创建正则表达式对象。
以下正则表达式将在javascript中工作,并匹配由未转义的方括号分隔的任何内容:
std::regex (R"((?<=\[)(.*?)(?=\]))");
但是在C ++中抛出一个未处理的异常。
怎么了?
首先,即使使用默认的正则表达式,你也不能在C ++ std::regex
模式中使用lookbehind,因为它基于当前Chrome浏览器中使用的ECMAScript 2018之前的ECMAScript规范,其中may use lookbehinds具有无限长度的模式。
MSVC C ++正则表达式ECMAScript风格对特殊字符转义的要求更高:]
字符必须始终被转义。
要提取可能包含转义序列的两个未转义方括号内的子串,您可以使用
std::regex reg(R"((?:^|[^\\])(?:\\{2})*\[([^\][\\]*(?:\\[\s\S][^\][\\]*)*)\])");
见regex demo。注意:它不支持嵌套的非转义方括号。
细节
(?:^|[^\\])
- 一个非捕获组织(?:\\{2})*
- 零反复重复双反斜杠\[
- 第1组:
[
- 除了([^\][\\]*(?:\\[\s\S][^\]\[\\]*)*)
,[^\][\\]*
和]
之外的零个或多个字符
[
- 零次或多次重复
\
- 一个(?:\\[\s\S][^\][\\]*)*
字符,随后是任何字符
\\[\s\S]
- 除了\
,[^\][\\]*
和]
之外的零个或多个字符见[
:
\
\]