{if cond}foo{else}bar{/if}와 일치하는 정규식
문제
나는 내가 원하지 않는 표현을 버리고, 내가 하고 싶은 표현을 유지하는 데 어려움을 겪고 있습니다.
문제는 - 입력 문자열이 주어지면:
{if cond}foo{else}bar{/if}
나는 다음을 갖고 싶습니다:
0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar
그리고 입력 문자열의 경우:
{if cond}foo{/if}
나는 다음을 갖고 싶습니다:
0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3:
현재 내가 가지고 있는 정규식은 다음과 같습니다.
\{if ([a-z0-9]+)\}([^\{]*?)(((?:\{else\})?)(.*?)?)\{/if\}
다음 데이터를 다시 얻습니다.
0: {if cond}foo{else}bar{/if}
1: cond
2:
3: foo{else}bar
4:
5: foo{else}bar
추가 구문 분석이 필요합니다. foo{else}bar
비트를 사용하여 해당 값을 가져옵니다.
내 정규 표현식이 거의 가까운가요?
나는 이것이 실행될 수 있는 데이터의 종류에 대해 별로 걱정하지 않습니다. {
if 문의 본문에서 정규식을 깨뜨릴 수 있습니다.가치 foo
그리고 bar
다음을 포함하지 않는 모든 항목이 될 수 있습니다. {
.
감사해요,
돔
해결책
이건 어때?
\{if ([a-z0-9]+)\}([^\{]*)(?:\{else\})?([^\{]*)\{/if\}
다른 팁
이것은 작동해야합니다 :
{if\s+([^}]*)}([^{]*)(?:{else}([^{]*))?{/if}
당신의 필요에 따라 탈출하십시오
정규식 테스터..NET 정규식 엔진을 사용하지만 유용할 수 있습니다.
질문에 언급 된 메모이지만 태그에서 Boost C ++ 라이브러리를 사용하는 것 같습니다.
어쩌면 부스트의 Spirit 라이브러리 (부스트에 포함)를 보는 것이 흥미로울 수도 있습니다. spirit.qi를 사용하면 복잡한 데이터를 구문 분석 할 수 있지만 문법은 EBNF처럼 보입니다. Companion Spirit.karam은 출력 형식을 정의하기 위해 ALOW, 구문과 같은 EBNF에서 다시.
이 라이브러리를 사용하면 템플릿 문서에서 AST를 생성하고 조작 한 다음 출력 문서를 생성 할 수 있습니다.
의 옆에 boost.spirit의 문서, 몇 가지 큰 슬라이드가 있습니다 2007 그리고 2008 Wich는 상당히 좋은 소개를합니다.