2014-07-18 2 views
0

정확한 부분 문자열과 일치하는 정규 표현식을 만들어 문자열에서 제거 할 수있게하려고합니다. (그것이 내가가 원하는처럼 {ABC}을 일치) C++에서 std :: regex를 사용하여 정확한 부분 문자열과 일치합니다.

std::string str = "{abc}slkj skdjv{abc}nei slkjdf"; 
std::regex reg("{abc}"); 
str = std::regex_replace(str, reg, ""); 

나는 Regexr에 정규식을 시도하고 작동합니다. 그러나 위의 코드는 무한 루프로 진행되는 것 같습니다.

정규식을 사용하고 싶은 이유는 문자열 일치 검색 이외의 다른 것들을 제거하기 위해서입니다. 따라서 주어진 문자열 조작을 찾지 못했습니다. here.

정규식 문자열이 실제로 특정 문자열과 일치해야하는 대상은 무엇입니까?

+0

정규식 일치를 찾지 못하면 어떻게 코드가 무한 루프에서 실행됩니까? – Praetorian

+0

그 질문에 답이 없다. 그것은 regex_replace에서 멈추게됩니다. : | – mxdg

+0

'{}}는 반복 횟수에 사용되기 때문에'{abc}'는 유효하지 않은 정규 표현식입니다. 예를 들어'a {1,3}'은 1-3 개의'a' 문자를 찾습니다. 입력 내용의 형식이 잘못되었습니다. 단지 일치하는 항목을 찾지 못했을뿐입니다. 내 최고의 추측은 빈 문자열의 반복을 찾아서 검색 과정에서 결코 진전을 보이지 않으려 고하는 것이지만, 나는 확실하지 않습니다. –

답변

2

{abc}과 실제로 일치 시키려면 정규식 \{abc\}을 사용해야합니다. {}은 정규 표현식의 특수한 토큰이므로 이스케이프 처리해야합니다.

+2

그리고 원시 문자열 리터럴을 사용하지 않는 한 백 슬래시 자체를 문자열 리터럴 내에서 이스케이프해야합니다. – Praetorian

+0

원래 \ {abc \}를 시도했지만 Xcode에서 그 사실을 알지 못했습니다 \} 잘못된 이스케이프 시퀀스였습니다. 역 슬래시 자체의 탈출은 내가 필요로하는 것이었다. 감사! – mxdg

+0

@mxdg 아니, 백 슬래시를 벗어나지 말고, 컴파일러가 지원한다고 가정하면 원시 문자열 리터럴을 사용하십시오. - std :: regex reg (R "(\ {abc \})"); – Praetorian

관련 문제