2012-07-03 7 views
1

예를 들어 문자열 :C++에서 boost :: regex를 사용하여 문자열을 가져 오는 방법은 무엇입니까?

내가 부스트 : 정규식을 사용하여 중괄호 모든 것을 잡을 수 있도록하려면
std::string sentence = "Hello {Bobby}, hows {Johns}?." 

, 어떤 도움이나 지침 감상 할 수있다.

문자열에는 {bobby | john | cindy} 또는 {bobby || cindy} 또는 {bobby}}이 (가) 포함될 수 있습니다. 내가 그 정규식을 알아 내려고 애 쓰고있어.

감사합니다.

답변

-1

입력이 간단합니까? 중괄호 안에 부분 문자열 만 가져 오는 중입니까? 입력이 정규 표현식의 모든 기능을 다루지 않는다면 간단한 루프를 작성하여 찌르기를 수행하고 중괄호 안에있는 경우 상태를 유지 한 다음 문자열의 해당 바이트를 처리 할 수 ​​있습니다.

+0

이것은 매우 분명한 질문입니다. 귀하의 대답은 어떤 식 으로든 도움이되지 않습니다. – dwo

+0

아니요, 제가 제공 한 것이 더 복잡해집니다. 방금 시작했으면 좋겠어. 문자열에는 {bobby | john | cindy} 또는 {bobby || cindy} 또는 {bobby}}가 포함될 수 있습니다. 내가 그 정규식을 알아 내려고 애 쓰고있어. –

2

전체적인 접근법과 코드 예제는 described here입니다.

당신이 필요 정규식 것 같다 :

([^{}]*\{([^{}]*)\})+ 

이 정규식은 모든 문자열을 올바르게, 비 중첩 된 괄호를 쌍으로 사용하지 않는 일치하지 않습니다. 일치하는 경우 regex_iterator을 사용하여 일치하는 모든 두 번째 하위 그룹을 처리 할 수 ​​있습니다.

+0

정규식이 유효하지 않은 것 같습니다 ...받은 오류가 "올바른 정규 표현식이 아닙니다 :"반복 범위가 잘못되었습니다. " –

+0

@unwiseguy - 중괄호에서 벗어나는 것을 잊었습니다. 도망 갈 필요가 없습니다. 괄호 안의 중괄호는 {3} = aaa와 같은 반복 범위를 나타냅니다. –

0

David의 답변에 대한 귀하의 의견에 따라 정규식을 직접 구문 분석 할 수없는 영역이 될 수 있습니다. 네가 이중 괄호로 기술 한 것과 같은 중첩 된 물건은 나에게 파싱하기 위해 실제 문법이 필요할 수도있는 것으로 나를 공격한다. 어떤 경우에는 Bison에 대해 학습하는 "즐거움"을 얻습니다. 그것을 구문 분석 할 수없는 경우, 방법이보다 쉽습니다.

단일 중괄호. 간단합니다. 두 배 안쪽에 뭐가 있니? 용은 용. 왜냐하면 당신은 다음과 같은 것들에 빠지게됩니다. "너는 무엇을 원하니?" Bison에게 제공되는 문법은이를 작동시킬 수 있습니다. 나는 간단한 정규 표현식이 할 수 있을지 확신하지 못한다.

관련 문제