c ++ std :: regex没有按预期匹配

时间:2014-06-20 02:35:23

标签: c++ regex

我试图在MS VC ++ 2012中使用c ++ std :: regex实现一个简单的字符串测试方法。

const std::string str = "1.0.0.0029.443";

if ( std::regex_match( str, std::regex( "\\.0\\d+" ) ) )
    std::cout << "matched." << std::endl;

我猜测代码将匹配给定str的“.0029”部分。但是,它根本不匹配。 我在http://regex101.com/上尝试了它,但它确实有效。

3 个答案:

答案 0 :(得分:3)

std::regex_match报告完全匹配,即整个输入字符串必须与正则表达式匹配。

要匹配子序列,请使用std::regex_search

答案 1 :(得分:3)

使用std::regex_search代替返回您的子匹配。

const std::string str = "1.0.0.0029.443";

std::regex rgx("(\\.0[0-9]+)");
std::smatch match;

if (std::regex_search(str.begin(), str.end(), match, rgx)) {
    std::cout << match[1] << '\n';
}

答案 2 :(得分:0)

要确保您的正则表达式匹配完整字符串而不是其他任何内容,您需要这样的内容:

^(?:\d+\.)*\d+$

这转化为

if ( std::regex_match( str, std::regex( "^(?:\\d+\\.)*\\d+$" ) ) )
    std::cout << "matched." << std::endl;

锚点^$的开头和结尾都是必需的,否则您可能会匹配BANANA_0.1.12AND_APPLE

中间的字符串