C ++ std :: regex多行语法

时间:2012-06-20 14:19:17

标签: c++ regex c++11

我似乎无法使我的正则表达式正常工作。在ECMAScript中的多行文本中,这个正则表达式begin\n([\s\S]*\nend)?完全符合我的需要,I tested it here

当我将其翻译成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;
}

这只输出“开始”,我希望它与整个文本相匹配。

我的问题是:这里出了什么问题,在哪里可以找到std::regex引擎'语法的详细说明以及它们如何处理多行字符串。

2 个答案:

答案 0 :(得分:5)

无需支持多线支持......不在MSVC10中。

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

答案 1 :(得分:0)

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

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

2012年的原始答案:

  

这里有什么问题

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

  

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

据我所知,你不能。最好看的地方可能是Boost.Regex的文档,但请注意,它已被移动,因为它被提议用于标准化,并且std::regex中没有一些功能。