c ++ 11 / regex - 搜索精确字符串,转义

时间:2016-10-22 18:09:31

标签: c++ regex string c++11

假设您有一个由用户提供的字符串。它可以包含任何类型的角色。例如:

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被解释的事实,我把这些细节留了下来。

1 个答案:

答案 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