我有以下用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
时阻止对特殊字符的解释?
注意:上述功能只是我问题的简单说明。我需要防止在更大的正则表达式中解释字符串。如果没有正则表达式,我不需要另一种重写函数的方法。
答案 0 :(得分:1)
str.find(prefix) == 0
和str.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));