6

我似乎无法让我的正则表达式正常工作。在 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;
}

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

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

4

2 回答 2

5

无论如何,没有多行支持......不在MSVC10中。

您需要在模式中使用\r & \n伪造多行。这是一个大麻烦。

于 2012-10-16T21:17:27.777 回答
0

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

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

2012年的原始答案:

这里有什么问题

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

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

你不能,据我所知。最好看的地方可能是Boost.Regex的文档,但请注意,自从它被提议用于标准化并且具有一些不存在于std::regex.

于 2012-06-20T14:53:13.180 回答