2012-04-30 45 views
1

两个命名匹配组的平等,我有这样的正则表达式:检查使用正则表达式

<%(?<begintag>[^>]+)%>(?<inner>(.+?))<%/(?<endtag>[^%]+)%> 

我想才达到的是,检查begintag和ENDTAG平等。
考虑此输入:

<%layout%> 
    <%pagetitle="test"> 
     <%products%> 
      <div class="product"> 
       <img src="<%product-smallimage%>" class="thumbnail" alt="<%product-title%>"/> 
       <a class="buy-link" href="<%product-url%>"><%product-title%></a> 
      </div> 
     <%/products%> 

有没有什么办法来检查呢?

在此先感谢。

+2

警告 - 正则表达式不是一个可以用来正确解析HTML的工具。 http://stackoverflow.com/a/1732454/12971 – Greg

+0

我知道。我不想分析html标签。我想实现一个基于模板的商店,可以使用不同的主题。 我应该用适当的信息替换<%products%>内部htmls。 –

回答

3

正如伊戈尔说,你可以捕获开始标记的名称,然后使用反向引用,以配合同名的结束标记。虽然他的正则表达式有几个问题,这一个工程:

(?s)<%(?<begintag>[^>]+)%>(.+?)<%/\k<begintag>%> 

在这里,我使用了名为反向引用 - \k<begintag> - 而不是一个编号 - \1。如果您使用的是命名组,则使用命名的反向引用总是一个好主意,但在.NET中它是至关重要的。在.NET中,\1确实是而不是(?<begintag>[^>]+)相同,只是因为它是第一组。

我也用单线模式 - (?s) - 允许圆点(.+?)匹配换行符。

+0

谢谢你,这就像一个魅力。 –

0

您可以尝试使用(如下\1)正则表达式backreferences

<%(?<begintag>[^>]+)%>(?<inner>(.+?))<%/\1%> 
+0

感谢您的回答。但它不起作用...... –

+0

究竟什么不起作用?你有没有逃过C#字符串中的反斜杠? –

+0

我试图在[链接](http://regexhero.net/tester)中测试它,但没有奏效。我想艾伦回答了原因。 –