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

问题描述:

我想开发一个正则表达式,它将检测xsl样式表中的递归模板调用。正则表达式 - 找到2指定边界之间的特定文本

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

在下面的代码,我需要检测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> 

在这种特定的情况下,REG前是确定的。

在这种情况下,我删除了第二次调用B,正则表达式匹配最后一次调用B.这应该不会发生。

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

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

谢谢。

+1

不要使用正则表达式来解决这个问题。 – 2009-10-06 15:53:16

+2

同一句子中的“正则表达式”和“递归”是一个好兆头,表示您将遇到麻烦。需要“嵌套”的语言是不规则的,这意味着你无法精确地将它们与正则表达式匹配。一些正则表达式的实现可以让你做一些非常规的事情(例如:反向引用),但是一般来说,如果你试图匹配的东西不是普通的语言,我不会使用正则表达式。 – 2009-10-06 16:35:08

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

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

+0

我同意,正则表达式不是完美的工具。 但是,我正在做一个可以运行一次的小工具,也许是两次。我想快速创造一些东西,我能否接受这样的事实,即像你所描述的一些呼叫不会被发现。我不想长时间参与这个项目。 你可以建议我一个你认为合适的XML解析器工具吗? 如果有帮助:我打算在powershell或iron python中使用脚本在多个文件上运行此正则表达式。 感谢您的意见。 – 2009-10-06 16:34:31

+0

好吧,几乎所有的语言都有处理XML的设施,只需走节点可能不需要太多的努力。但我通常不这样做,因此在处理XML方面并不精通。 – Joey 2009-10-06 16:43:28

+0

@ Jean-Francois:PowerShell内置了非常强大的XML支持。请参阅http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-14-xml.aspx – TrueWill 2009-10-06 17:46:20