2012-01-03 6 views
1

내가 JS에 나뭇 가지/신사 템플릿 파서를 구축하고, 자바 스크립트에 다음 문자열과 일치 할 필요 해요 : 지금까지다음 정규 표현식에 {이스케이프를 어떻게 추가 할 수 있습니까?

{%render "base"%} 
{% render "base" with {"color":"red0xFF0000", "number": 123} %} 

I가 다음과 같은 정규 표현식, RegexBuddy 내장과 같이

\{% ?render *"[a-z0-9:._]+" ?((?:with +)({([^\{\}]*)}))? ?%} 

위의 두 렌더링 태그를 모두 일치 시키지만, 절의 본문에 \{\}을 이스케이프 할 수 있습니다.

나는 지금 모든 것을 시도했지만이 100 % 작동하지 않습니다. 내가 예를 들어과 같이 중괄호를 추가 할 때 :

{% render "base" with {"color":"red\{0xFF0000\}", "number": 123} %} 

을가 red 단지 과거 첫 {에서 종료 사촌 문자열은 일치하지 않습니다.

기본적으로 정규 표현식을 일치 시키길 원하지만 앞에는 \이 붙어 있습니다.

아이디어가 있으십니까?

+1

왜 당신이 부정적 예측을 사용하지 않는''또는 옵션 그룹 (\\?!)'(\\\})? ' –

+0

나는 그것을 시도하고 있지만 그 곳을 미끄러 뜨릴 곳이 확실하지 않다. –

+1

FWIW, 정규 표현식을 전혀 사용하지 않겠다. 적절한 토큰 별 구문 분석기는 IMHO보다 덜 복잡합니다 (그리고 더 효율적일 수 있습니다). – You

답변

0
{% ?render *"[a-z0-9:._]+" ?((?:with +)({[^{}\\]*(?:\\.[^{}\\]*)*}))? ?%} 

까다로운 부분이 있습니다 : - [^{}\\]* 여는 중괄호 후

{[^{}\\]*(?:\\.[^{}\\]*)*} 

, 그것은 제로 또는 중괄호 또는 백 슬래시가 아니라 그 무엇보다 일치합니다. 백 슬래시가 발생하면 그 문자와 다음 문자 - \\.을 사용합니다. 이스케이프 처리되지 않은 닫는 중괄호에 도달 할 때까지 필요에 따라 프로세스를 반복합니다.

0

관련 부분을 lazy grab anything (. *?)으로 변환 할 수 있습니까? < 정규식에 포함되지 않았습니다! < 또는 비트 < 또는이 .... 등

{% ?render *"[a-z0-9:._]+" ?((?:with +)({(.*?)}))? ?%} 
관련 문제