2009-10-06 4 views
0

xsl 스타일 시트에서 재귀 템플릿 호출을 감지하는 정규식을 개발하려고합니다.regex - 지정한 두 경계 사이의 특정 텍스트 찾기

지금까지 성공하지 못했습니다. 다음 코드에서

, 나는 재귀 적으로 호출되는 템플릿 B를 감지해야이 특정한 경우

<xsl:template name="A"> 
    blah blha [email protected]#?%$#^%?*?&(({}:"><;'[]\/.,./' 
    <xsl:call-template name="B"> 
    blah blah  
</xsl:template>  
<xsl:template name="B"> 
    blah blha 
    <xsl:call-template name="B">     
    blah blah 
</xsl:template> 
<xsl:template name="C"> 
    blah blha 
    <xsl:call-template name="B"> 
    blah blah 
</xsl:template> 

에서, 등록의 예는 괜찮습니다.

B에 대한 두 번째 호출을 제거한 경우 정규 표현식이 마지막 호출 B와 일치합니다. 발생하지 않아야합니다.

(<xsl:template name=\"(?<templateName>\w+)\">.*?(?<=<xsl:call-template name=\"\k<templateName>\">).*?</xsl:template>)+ 

저는 정규식 전문가가 아닙니다. 어떤 도움도 환영합니다.

감사합니다.

+1

이를 해결하기 위해 정규 표현식을 사용하지 마십시오. –

+2

동일한 문장에서 "정규 표현식"과 "재귀 적"은 문제가있을 것이라는 좋은 신호입니다. "중첩"이 필요한 언어는 정규 언어가 아니므로 정규 표현식과 정확히 일치시킬 수 없습니다. 일부 정규식 구현은 비정규 항목 (예 : 역 참조)을 수행 할 수 있지만 일반적으로 일치시키려는 항목이 일반 언어가 아닌 경우 일반 표현식을 사용하지 않습니다. –

답변

8

명백한 포인트 반복 : 정규 표현식으로 XML 또는 기타 비정규 언어를 구문 분석하지 마십시오. 부디.

XML 파서를 사용하여 결과 트리를 확인하십시오. 템플릿 호출의 다이 그래프를 만들어 그 안에서 사이클을 찾을 수 있습니다. 정규식과 함께 해킹하려고 시도하는 것보다 훨씬 강력한 솔루션이어야합니다. 그렇게하면 템플릿 A가 템플릿 C를 호출하는 템플릿 B를 호출하고 템플릿 A를 다시 호출 할 수도 있습니다. 이러한 종류의 재귀는 현재의 접근 방식에서 보이지 않습니다 (작동하도록 설득 될 수 있다면).

+0

나는 동의한다, 정규식은 그것을위한 완벽한 도구가 아니다. 하지만 한 번, 두 번 실행될 작은 도구를 만들고 있습니다. 나는 뭔가를 빨리 만들고 싶다. 당신 같은 묘사가 감지되지 않을 것이라는 사실과 함께 살 수 있을까? 저는 그 프로젝트에 오랫동안 참여하고 싶지 않습니다. 필자가 적합하다고 생각하는 xml 파서 도구를 제안 해 주시겠습니까? 도움이되는 경우 :이 정규식을 powershell 또는 iron python 스크립트로 여러 파일에서 실행할 계획이었습니다. 의견을 보내 주셔서 감사합니다. –

+0

거의 모든 언어에는 XML을 처리 할 수있는 기능이 있으며 간단히 노드를 걷는 것은 많은 노력을 필요로하지 않을 것입니다. 그러나 나는 이것을 보통하지 않으며 따라서 XML을 다루는 데 실제로 능숙하지 않습니다. – Joey

+0

@ Jean-Francois : PowerShell에는 매우 강력한 XML 지원 기능이 내장되어 있습니다. http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-14-xml.aspx – TrueWill

관련 문제