与VS2010的std :: regex_match问题

时间:2014-01-29 07:30:20

标签: c++ regex visual-studio-2010

我在使用以下代码时遇到问题:

std::cmatch what;
std::regex regExp("(\\[-?\\d+\\])+", std::regex_constants::ECMAScript);
std::cout << "std::regex1: " << std::regex_match("[-123]", what, regExp);
std::cout  << "std::regex2: " << std::regex_match("[-123][456]", what, regExp);

boost::cmatch what2;
boost::regex regExp2("(\\[-?\\d+\\])+", boost::regex_constants::ECMAScript);
std::cout << "boost::regex1: " << boost::regex_match("[-123]", what2, regExp2);
std::cout << "boost::regex2: " << boost::regex_match("[-123][456]", what2, regExp2);

我预计第二个表达式(“std :: regex2”)会返回true,但它不会。 boost中的相同表达式返回true。

我玩了一下,发现它匹配[123] [ - 456]或[123] [456] [ - 789]。只有最后一个元素才接受“ - ”,尽管它对所有元素都是可选的。 这是一个错误还是我做错了什么?

祝你好运,   马库斯

P.S。:我使用VS2010。

1 个答案:

答案 0 :(得分:1)

我同意你的看法,“std :: regex2”表达式应该返回true。我也能够在Visual Studio 2010中验证这一点,并重现了同样的问题。

所以我在Visual Studio 2012中尝试了相同的代码,这次你的代码产生了预期的答案(true)。所以答案是这在VS2010中被破坏并在VS2012中修复。

在Visual Studio 2012中修复了几个正则表达式错误,因此这应该解释VS2010和VS2012之间的差异。有关VS2012中修复的STL错误的列表,请参见以下页面。

http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320846.aspx