2012-04-30 42 views
1

兩個命名匹配組的平等,我有這樣的正則表達式:檢查使用正則表達式

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

警告 - 正則表達式不是一個可以用來正確解析HTML的工具。 http://stackoverflow.com/a/1732454/12971 – Greg

+0

我知道。我不想分析html標籤。我想實現一個基於模板的商店,可以使用不同的主題。 我應該用適當的信息替換<%products%>內部htmls。 –

回答

3

正如伊戈爾說,你可以捕獲開始標記的名稱,然後使用反向引用,以配合同名的結束標記。雖然他的正則表達式有幾個問題,這一個工程:

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

在這裏,我使用了名爲反向引用 - \k<begintag> - 而不是一個編號 - \1。如果您使用的是命名組,則使用命名的反向引用總是一個好主意,但在.NET中它是至關重要的。在.NET中,\1確實是而不是(?<begintag>[^>]+)相同,只是因爲它是第一組。

我也用單線模式 - (?s) - 允許圓點(.+?)匹配換行符。

+0

謝謝你,這就像一個魅力。 –

0

您可以嘗試使用(如下\1)正則表達式backreferences

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

感謝您的回答。但它不起作用...... –

+0

究竟什麼不起作用?你有沒有逃過C#字符串中的反斜槓? –

+0

我試圖在[鏈接](http://regexhero.net/tester)中測試它,但沒有奏效。我想艾倫回答了原因。 –