C++ std :: regex多行语法

Gar*_*art 6 c++ regex c++11

我似乎无法使我的正则表达式正常工作.在ECMAScript中的多行文本中,这个正则表达式begin\n([\s\S]*\nend)?完全符合我的需要,我在这里测试了它.

当我将它翻译成C++时,它无法匹配相同的文本.

这是我在Visual C++ 2010中的代码:

#include <iostream>
#include <regex>

int main(int argc, char *argv[]) {
    std::regex metadataBlockRegex("begin\\n([\\s\\S]*\\nend)?",
        std::regex::ECMAScript);

    std::string text =
      "begin\n"
      "  123\n"
      "end\n";

    std::sregex_iterator blocksBegin(text.begin(), text.end(), metadataBlockRegex);
    std::sregex_iterator blocksEnd;

    for (auto blockMatch = blocksBegin; blockMatch != blocksEnd; ++blockMatch) {
            std::cout << (*blockMatch)[0].str();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这只输出"开始",我希望它匹配整个文本.

我的问题是:这里有什么问题,我在哪里可以找到std::regex引擎语法的详细描述以及它们如何处理多行字符串.

Cod*_*gry 5

无论如何都没有多线支持......不在MSVC10中.

您需要在模式中使用\ r&\n伪造多行.这是一个重大的失败.


Jon*_*ely 0

LWG 2503添加了multiline语法选项,这应该使您的程序在使用该选项时按预期工作(对于支持该新功能的 C++ 实现)。

LWG 2343有更多背景知识,解释了 ECMAScript RegExp 对象具有默认为 false 的 Multiline 属性,以及不同 C++regex实现的行为。

2012年的原始答案:

这里出了什么问题

不确定,看起来不错,但我有权访问的唯一 C++11 实现不支持<regex>

在哪里可以找到 std::regex 引擎语法以及它们如何处理多行字符串的详细描述。

据我所知,你不能。最好的查找位置可能是Boost.Regex的文档,但请注意,由于它被提议用于标准化,并且具有std::regex.