我似乎无法使我的正则表达式正常工作。在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
引擎'语法的详细说明以及它们如何处理多行字符串。
答案 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
中没有一些功能。