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

问题描述 投票:0回答:1

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

以下正则表达式将在javascript中工作,并匹配由未转义的方括号分隔的任何内容:

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

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

怎么了?

c++ regex std throw unhandled-exception
1个回答
0
投票

首先,即使使用默认的正则表达式,你也不能在C ++ std::regex模式中使用lookbehind,因为它基于当前Chrome浏览器中使用的ECMAScript 2018之前的ECMAScript规范,其中may use lookbehinds具有无限长度的模式。

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

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

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

regex demo。注意:它不支持嵌套的非转义方括号。

细节

  • (?:^|[^\\]) - 一个非捕获组织
  • (?:\\{2})* - 零反复重复双反斜杠
  • qazxsw poi - 一张qazxsw poi图表
  • \[ - 第1组: [ - 除了([^\][\\]*(?:\\[\s\S][^\]\[\\]*)*)[^\][\\]*]之外的零个或多个字符 [ - 零次或多次重复 \ - 一个(?:\\[\s\S][^\][\\]*)*字符,随后是任何字符 \\[\s\S] - 除了\[^\][\\]*]之外的零个或多个字符
  • qazxsw poi - 一张qazxsw poi图表。

[

\

\]

© www.soinside.com 2019 - 2024. All rights reserved.