2012-04-30 2 views
1

у меня есть это регулярное выражение:Проверка равенства двух именованных Matching групп с использованием регулярных выражений

<%(?<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

Warning - Regex не является инструментом, который можно использовать для правильного анализа HTML. http://stackoverflow.com/a/1732454/12971 – Greg

+0

Я знаю. Я не хочу анализировать теги html. Я хочу реализовать шаблонный магазин, который может использовать разные темы. Я должен заменить <%products%> внутренние htmls с соответствующей информацией. –

ответ

3

Как сказал Игорь, вы можете захватить имя открывающего тега, а затем использовать обратной ссылки, чтобы соответствовать закрывающий тег с таким же именем , Однако есть пара проблем с его регулярным выражением; это работает:

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

Здесь я использовал имя - \k<begintag> обратной ссылки - вместо нумерованных один - \1. Всегда полезно использовать именованные обратные ссылки, если вы используете именованные группы, но в .NET это важно. В .NET \1 делает не соответствует тому же, что и (?<begintag>[^>]+) только потому, что это первая группа.

Я также использовал Singleline mode - (?s) - чтобы разрешить точку в (.+?), чтобы соответствовать linefeeds.

+0

спасибо, что сработало как шарм. –

0

Вы можете попробовать использовать регулярные выражения backreferences (\1 ниже):

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

спасибо за ваш ответ. но это не сработало ... –

+0

Что точно не сработало? Вы избежали обратной косой черты в строке C#? –

+0

Я попытался протестировать его в этой [ссылке] (http://regexhero.net/tester), но это не сработало. Я думаю, Алан ответил на эту причину. –