假设您有一个由用户提供的字符串。它可以包含任何类型的角色。例如:
std::string s1{"hello world");
std::string s1{".*");
std::string s1{"*{}97(}{.}}\\testing___just a --%#$%# literal%$#%^"};
...
现在我想在一些文本中搜索>>
后跟输入字符串s1
后跟<<
的情况。为此,我有以下代码:
std::string input; // the input text
std::regex regex{">> " + s1 + " <<"};
if (std::regex_match(input, regex)) {
// add logic here
}
如果s1
不包含任何特殊字符,则此方法正常。但是,如果s1
有一些由正则表达式引擎识别的特殊字符,则它不起作用。
我如何逃避s1
以使std::regex
将其视为文字,因此不会解释s1
?换句话说,正则表达式应该是:
std::regex regex{">> " + ESCAPE(s1) + " <<"};
ESCAPE()
中有std
这样的函数吗?
重要我简化了我的问题。在我的实际案例中,正则表达式要复杂得多。由于我只是解释了s1
被解释的事实,我把这些细节留了下来。
答案 0 :(得分:4)
您必须使用\
转义字符串中的所有特殊字符。最简单的方法是在创建表达式regex
之前使用另一个表达式来清理输入字符串。
// matches any characters that need to be escaped in RegEx
std::regex specialChars { R"([-[\]{}()*+?.,\^$|#\s])" };
std::string input = ">> "+ s1 +" <<";
std::string sanitized = std::regex_replace( input, specialChars, R"(\$&)" );
// "sanitized" can now safely be used in another expression