我有这个正则表达式:
<%(?<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%>
有没有办法检查这个?
提前感谢。
答案 0 :(得分:3)
正如Igor所说,您可以捕获开始标记的名称,然后使用反向引用来匹配具有相同名称的结束标记。他的正则表达式有几个问题;这个有效:
(?s)<%(?<begintag>[^>]+)%>(.+?)<%/\k<begintag>%>
我在这里使用了一个名为的反引用 - \k<begintag>
- 而不是编号的一个 - \1
。如果你使用命名组,那么使用命名反向引用总是一个好主意,但在.NET中它是必不可少的。在.NET中,\1
不与(?<begintag>[^>]+)
匹配的内容只是因为它是第一组。
我还使用了单线模式 - (?s)
- 允许(.+?)
中的点匹配换行符。
答案 1 :(得分:0)
您可以尝试使用正则表达式backreferences(下面的\1
):
<%(?<begintag>[^>]+)%>(?<inner>(.+?))<%/\1%>