我在使用以下代码时遇到问题:
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。
答案 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