Проверьте равенство двух именованных групп соответствия с помощью регулярного выражения

У меня есть это регулярное выражение:

<%(?<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%>
Другие вопросы по тегам