2016-10-22 10 views
4

사용자가 제공 한 문자열이 있다고 가정 해보십시오. 그것은 모든 종류의 문자를 포함 할 수 있습니다. 예는 다음과 같습니다 C++ 11/regex - 정확한 문자열 검색, 이스케이프

std::string s1{"hello world"); 
std::string s1{".*"); 
std::string s1{"*{}97(}{.}}\\testing___just a --%#$%# literal%$#%^"}; 
... 

가 지금은 << 다음에 입력 문자열 s1 다음 >>의 발생에 대한 몇 가지 텍스트로 검색 할. s1는 특수 문자를 포함하지 않은 경우이 잘 작동

std::string input; // the input text 
std::regex regex{">> " + s1 + " <<"}; 

if (std::regex_match(input, regex)) { 
    // add logic here 
} 

:이를 위해, 나는 다음과 같은 코드가 있습니다. 그러나 s1에 정규식 엔진에서 인식 할 수있는 특수 문자가 있으면 작동하지 않습니다.

s1에서 std::regex이 리터럴로 간주되므로 어떻게 s1을 해석하지 않습니까? 즉, 정규식은 다음과 같아야합니다 stdESCAPE() 같은 기능은

std::regex regex{">> " + ESCAPE(s1) + " <<"}; 

있습니까?

중요 나는 내 질문을 단순화했습니다. 제 실제의 경우, 정규식은 훨씬 더 복잡합니다. s1이 해석된다는 사실만으로 문제가 발생하기 때문에이 세부 정보를 남겼습니다.

+2

정규식을 사용해야하는 특별한 이유가 있습니까? 이것은'string.find'로 할 수 있습니다. –

+0

왜 입력 문자열 _ ('s1')을 정규식으로 사용합니까 ?? 아마도'std :: regex 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'을 포함 시켰 습니다만, 왜 당신이 그럴 필요가 있는지 확신하지 못합니다. (아마도 newline 핸들링입니까?) 나는 std :: regex가 개행 문자를 처리하는 방법과 이스케이프 처리 방법을 기억하지 못합니다. 그것들은 차이를 만든다). 그리고 이전의 코멘트에서''\''역시'specialChars '에 포함되어야한다고 말하려고했지만 Markdown이 그것을 먹었습니다. – Cornstalks

관련 문제