我似乎无法使我的正则表达式正常工作.在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
引擎语法的详细描述以及它们如何处理多行字符串.
LWG 2503添加了multiline
语法选项,这应该使您的程序在使用该选项时按预期工作(对于支持该新功能的 C++ 实现)。
LWG 2343有更多背景知识,解释了 ECMAScript RegExp 对象具有默认为 false 的 Multiline 属性,以及不同 C++regex
实现的行为。
2012年的原始答案:
这里出了什么问题
不确定,看起来不错,但我有权访问的唯一 C++11 实现不支持<regex>
在哪里可以找到 std::regex 引擎语法以及它们如何处理多行字符串的详细描述。
据我所知,你不能。最好的查找位置可能是Boost.Regex的文档,但请注意,由于它被提议用于标准化,并且具有std::regex
.