Проверьте равенство двух именованных групп соответствия с помощью регулярного выражения
У меня есть это регулярное выражение:
<%(?<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 ответа
Как сказал Игорь, вы можете зафиксировать имя открывающего тега, а затем использовать обратную ссылку, чтобы сопоставить закрывающий тег с тем же именем. Однако есть несколько проблем с его регулярным выражением; этот работает:
(?s)<%(?<begintag>[^>]+)%>(.+?)<%/\k<begintag>%>
Здесь я использовал именованную обратную ссылку - \k<begintag>
- вместо пронумерованного - \1
, Всегда рекомендуется использовать именованные обратные ссылки, если вы используете именованные группы, но в.NET это важно. В.NET, \1
не совпадает с тем же (?<begintag>[^>]+)
просто потому что это первая группа.
Я также использовал режим Singleline - (?s)
- разрешить точку в (.+?)
для соответствия переводам строки.
Вы можете попробовать использовать обратные ссылки на регулярные выражения (\1
ниже):
<%(?<begintag>[^>]+)%>(?<inner>(.+?))<%/\1%>