2017-03-16 8 views
2

지금은 [^ \\&<>|\t\n]+을 사용합니다.이 문자는 공백이 아니라 \, &, <,>, |, \ t, \ n. 내가하고 싶은 일은 또한이 특수 문자를 이스케이프 할 수있게하여 \ < 또는 \ &과 같이 전체 문자열을 계속 일치시킬 수 있습니다.특수 문자 (&, , <, >, |)가 포함되지 않은 문자열을 정규식을 사용하여 백 슬래시로 처리하지 않는 경우

는 일치해야합니다 :

abcdefghijk abcdef\&hdehud\<jdow\\

이 일치하지해야 :

난 그냥 "["문자 같은 일을이 패턴 ([^\[]|(?<=\\)\[)+을 발견 abcdefhfh&kdjeid abcdjedje\idwjdj

. 나는 이것을 추가 문자에 적용하는 방법을 알아낼 수 없었다.

백 슬래시가있는 문자의 예외를 어떻게 만들 수 있습니까?

차이가 있다면, 이것을 Flex 및 C++에서 쉘용 문자열을 토큰 화하는 데 사용하고 있습니다. 나는 부정적인 look-behinds를 사용할 필요가 있다고 믿지만 여러 문자로 어떻게해야하는지 모르겠습니다. 그래서 당신이 할 일은 다음 부정하지 않고 동일한 세트를 사용한다, 당신은 문자가 존재하지 않을 수있는에서 지정할하기 위해 부정 세트 [^ \\&<>|\t\n]을 사용하는

:

+0

반면에, 당신이 말하기를 "나는이 특수 문자 중 어느 것도 벗어날 수있게하고 싶습니다."라고 말하면 한편으로는 이스케이프가 필요한 것으로 보입니다. 반면에,'유효한 문자열은 : abcdefghijk abcdef \ & hdehud \'라고 말하면 공간은 이스케이프되지 않습니다. –

+0

죄송합니다, 지금 해결! 그것들은 별도의 문자열이라고 여겨졌습니다. 문자열이있는 문자열이 아닙니다. –

+0

https://regex101.com/r/PeFm8A/1 –

답변

6

당신은 이미 답을 대부분의 방법입니다 문자를 이스케이프하려면 \ 앞에 와야합니다. 그러면이 \\[ \\&<>|\t\n]을 얻을 수 있으며 "\ 다음에 세트의 항목 중 하나가 표시됩니다."이제 두 개를 결합하면 ([^ \\&<>|\t\n]|\\[ \\&<>|\t\n])+이됩니다.

을 분해하려면

하나 더 : 여기에 정규 표현식을 사용 [^ \\&<>|\t\n] 또는 평소처럼

+0

완벽하게 작동했습니다. 덕분에 너무 많이! 내 부정으로 각 개별 특수 문자를 사용하여 복잡하게 만들려고했으나 제대로 작동하지 못했습니다. 이 솔루션은 간단하고 많은 의미가 있습니다! –

2

\\[ \\&<>|\t\n]은 과잉이다. 이것은 간단한 텍스트 검색입니다 :

const std::string target = "\\&<>|"; 
std::string iter = str.find_first_of(target); 
while (iter != str.end()) { 
    if (*iter != '\\') 
     found_bad_character(*iter); 
    iter = str.find_first_of(target, std::next(iter)); 
} 
+0

이것은 플렉스에서 쉘용 렉서 (lexer)로 사용 되었기 때문에 토큰을 지정하는 정규 표현식이 필요했지만 다른 경우에는 도움이되는 해결책을 볼 수있었습니다! –