문제

나는 내가 원하지 않는 표현을 버리고, 내가 하고 싶은 표현을 유지하는 데 어려움을 겪고 있습니다.

문제는 - 입력 문자열이 주어지면:

{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는 상당히 좋은 소개를합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top