使用正则表达式检查两个命名匹配组的相等性

时间:2012-04-30 15:55:38

标签: c# regex backreference

我有这个正则表达式:

<%(?<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 个答案:

答案 0 :(得分:3)

正如Igor所说,您可以捕获开始标记的名称,然后使用反向引用来匹配具有相同名称的结束标记。他的正则表达式有几个问题;这个有效:

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

我在这里使用了一个名为的反引用 - \k<begintag> - 而不是编号的一个 - \1。如果你使用命名组,那么使用命名反向引用总是一个好主意,但在.NET中它是必不可少的。在.NET中,\1 (?<begintag>[^>]+)匹配的内容只是因为它是第一组。

我还使用了单线模式 - (?s) - 允许(.+?)中的点匹配换行符。

答案 1 :(得分:0)

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

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