防止在std :: regex中解释特殊字符

时间:2014-12-03 18:13:12

标签: c++ regex c++11

我有以下用C ++ 11编写的函数,该函数使用标准regex模块中的正则表达式。顾名思义,它确定给定字符串str是否是以给定prefix为前缀的数字。

bool isPrefixedNumber(const std::string &prefix, const std::string &str) {
    std::regex re(prefix + "[[:digit:]]+"))
    return std::regex_match(str, re);
}

问题是我希望prefix按字面意思理解,即我想要

isPrefixedNumber("t.st", "tXst123")

返回false。有没有办法构建这样的正则表达式而无需手动转义prefix中出现的所有特殊字符?换句话说,如何在将std::string传递到std::regex时阻止对特殊字符的解释?

注意:上述功能只是我问题的简单说明。我需要防止在更大的正则表达式中解释字符串。如果没有正则表达式,我不需要另一种重写函数的方法。

2 个答案:

答案 0 :(得分:1)

str.find(prefix) == 0str.find_first_not_of("0123456789", prefix.size()) != std::string::npos是您想要的两件事。

每当您有匹配的需求时,请考虑正则表达式实际上是在运行时解析和执行的程序。与编写几行C ++代码相比,然后决定哪个更好,但不要从一开始就针对正则表达式。

答案 1 :(得分:0)

我可能只是将这两个部分分开匹配,就像这条总路线一样:

std::string::size_type pos;

std::regex re(prefix + "[[:digit:]]+"));

return ((pos = str.find(prefix)) != std::string::npos) 
     && std::regex_match(str.substr(pos+prefix.size()), re));