C ++正则表达式未处理的异常(ES正则对象)

时间:2019-03-17 14:17:03

标签: c++ regex std throw unhandled-exception

我已阅读到默认情况下C ++使用ES规范创建正则表达式对象。

以下正则表达式将在javascript中工作,并且匹配任何用不转义的方括号定界的内容:

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

但是在C ++中抛出未处理的异常。

怎么了?

1 个答案:

答案 0 :(得分:0)

首先,即使具有默认的正则表达式风格,您也不能在C ++ os.open模式中使用后退,因为它基于的ECMAScript规范早于您在{{3} },并且长度不受限制。

MSVC C ++正则表达式ECMAScript风格对特殊字符转义的要求更高:std::regex字符必须始终被转义。

要在两个未转义的方括号中提取可能包含转义序列的方括号,您可以使用

]

请参见may use lookbehinds注意:它不支持嵌套的未转义方括号。

详细信息

  • std::regex reg(R"((?:^|[^\\])(?:\\{2})*\[([^\][\\]*(?:\\[\s\S][^\][\\]*)*)\])"); -非捕获组
  • (?:^|[^\\])-零个或多个重复的双反斜杠
  • (?:\\{2})*-一个\[字符
  • [-第1组:
    • ([^\][\\]*(?:\\[\s\S][^\]\[\\]*)*)-除[^\][\\]*][以外的零个或多个字符
    • \-的零次或多次重复
      • (?:\\[\s\S][^\][\\]*)*-一个\\[\s\S]字符,后跟任意字符
      • \-除[^\][\\]*][以外的零个或多个字符
  • \-一个\]字符。

请参见regex demo

]

C++ demo