2012-12-12 2 views
5

학교 프로젝트의 일환으로 매우 간단한 스크립트 구문 분석기를 작성하고 필요하지 않지만 정규식으로 만 수행 할 수 있는지 궁금합니다.정규식, 따옴표 안에있는 경우 패턴 무시

구문은 ASP와 유사하며 스크립트는 < %로 시작하고 %>로 끝납니다.

에코 또는 Response.Write와 같은 하나의 명령 "pr"만 지원합니다.

지금 내가 스크립트 블록 찾으려면이 정규 표현식을 사용하고 있습니다 :

(<%\s*([\s\S]*?)\s*%>) 

하지만이 같은 명령이있는 경우 :

<% pr "%>"; %> 

를 ... 그것은 분명히에만 일치를 :

<% pr "%> 

순수 정규식을 사용하여 따옴표 안에있는 닫기 태그를 무시하는 방법이 있습니까? 내 주된 걱정은 태그가 따옴표 사이에 있지만 실제로는 태그 외부에있는 태그와 일치 할 수 있다는 것입니다. 예를 들어 ...

<% pr "hello world"; %> " 

는 기술적으로 닫는 태그는 따옴표로 둘러싸여 있지만, 다른 방법으로 주위 오히려, 후 "열기" "닫기"따옴표 안에 아니다.

정규식을 사용하면이 기능을 지원할 수 있다면이 기능을 지원하려면 수동으로 수신 텍스트를 반복하고 블록을 구문 분석해야합니다. 실제로 큰 문제는 아닙니다. 어느 한 쪽.

감사합니다.

+0

동안 (의사 코드를 사용하여) 예를 들어

, 그것은 불가능하다. 예를 들어, 마지막 예제가''<% pr "hello world"; %> "'로 확장되지 않아야하는 이유는 무엇입니까? 따옴표 안이나 바깥에 모두 '<%' and '%>'이 없습니까? 마지막 예제에서 후행의 ""가 나중에 입력과 일치한다는 것을 확신 할 수 있습니까? –

답변

3

나는 귀하의 요구에 맞아야한다고 생각합니다 : <%(".*?"|.*?)*?%> (Demo 참조).

설명 :

가능한 한 오랫동안 일치 .* 동안, .*? 경기 수 한 적은 . 당신의 따옴표가 일치하지 않는 경우

"#foo# #bar#".matches(/#(.*)#/).group(1) // will return ["foo# #bar"] 

"#foo# #bar#".matches(/#(.*?)#/).group(1) // will return ["foo", "bar"] 
+1

이것은 아주 잘 작동합니다! 새 라인 문자를 포함시키고 필요로하는 캡처 그룹을 추가하기 위해 약간 마사지했습니다. 훌륭하게 작동합니다. – ARW