正则表达式 - 在2个指定边界之间找到特定文本

时间:2009-10-06 15:50:07

标签: regex recursion

我正在尝试开发一个可以在xsl样式表中检测递归模板调用的正则表达式。

到目前为止,它还没有真正成功。

在下面的代码中,我需要检测模板B是否递归调用:

<xsl:template name="A"> 
     blah blha ?!@#?%$#^%?*?&(({}:"><;'[]\/.,./'
    <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>

在这种特定情况下,reg ex是可以的。

如果我删除了对B的第二次调用,则正则表达式匹配最后一次对B的调用。这不应该发生。

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

我不是正则表达的大师。欢迎任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:8)

重申一个明显的观点:不要尝试使用正则表达式解析XML或其他非常规语言。请。

使用XML解析器并查看生成的树。您可以创建模板调用的图表并查找其中的周期。应该是一个更强大的解决方案,而不是试图与正则表达式一起破解它。通过这种方式,您还可以检测到模板A可能调用模板B,模板B调用模板C并再次调用模板A.这种类型的递归对于您当前的方法是不可见的(如果它可以被说服起作用)。