2016-10-22 91 views
4

假设您有一个由用户提供的字符串。它可以包含任何种类的角色。例子有: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) + " <<"}; 

有没有像在stdESCAPE()的功能?

重要我简化了我的问题。在我的真实情况下,正则表达式要复杂得多。由于我只是在解释s1这个事实上遇到麻烦,所以我将这些细节留下了。

+2

是否有使用正则表达式的特殊原因?这可以通过'string.find'来完成 –

+0

为什么你使用_the input string_('s1')作为正则表达式?也许像'std :: regex正则表达式{“>> * <<”};'会更好? – ForceBru

+0

@Austin Brunkhorst是的,我需要正则表达式。我简化了这个问题,因为我只是在引擎解释字符串的事实上挣扎着。在我的真实情况下,正则表达式更复杂。 –

回答

1

您将不得不跳过字符串中的所有特殊字符\。最直接的方法是在创建表达式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 
+0

你真的需要在这里逃脱'^'吗?你是否包含了所有空白来处理换行或什么?一点解释会很有用。另外,你是否也需要逃避'\'? – Cornstalks

+0

'^'为了完整性而匹配 - 显然它永远不会匹配行的开始和前面的>> >>,但是OP说这个例子被简化了。你能详细说一下你对空白和换行符的含义吗? –

+1

包括'^'是有道理的,但是你已经用反斜杠逃脱了。我很好奇为什么你在这种情况下用反斜杠逃脱了它。此外,你已经包含'\ s',它符合空格,但我不知道为什么你需要这样做(也许换行符处理?我不知道;我不记得std :: regex是如何处理换行符以及是否转义他们或不会有所作为)。在我以前的评论中,我试图说''''''也应该包含在'specialChars'中,但是Markdown会吃掉它。 – Cornstalks