2009-09-01 132 views
0

我想寫一個正則表達式匹配這樣的模式:用正則表達式不匹配,在結束

<td style="alskdjf" /> 

即自終止<td>

但不是這樣的:

<td style=alsdkjf"><br /></td> 

我最初想出了:

<td\s+.*?/> 

但顯然未能在第二個例子中,我想這樣的事情可能工作:

<td\s+.*?[^>]/> 

但事實並非如此。我正在使用C#.NET。

只尋找<td>的有一個屬​​性。例如尋找<td style="alsdfkj" />但不是<td>

回答

4

這將匹配你在找什麼,而不是你有沒有跟你第一次試了幾次有問題的情況下匹配:

<td[^>]*?/> 

但是請注意,如果你需要,允許在屬性值>字符,你需要這樣的事:

<td(?:[^>]|"[^"]*?")*?/> 

這允許>僅在匹配的雙引號(你可以同樣展開它允許單引號)。

你可以添加任何你正在尋找的特定屬性到正則表達式;例如用於你的例子:

<td[^>]*? style="alskdjf"[^>]*?/> 
4

由於HTML不規則,所以使用正則表達式與HTML會產生問題。我建議使用HTML解析器來處理所有情況,但非常簡單。

+0

這取決於案件。像OP所試圖匹配的那樣的自終止標籤實際上是規則的,只要屬性值中沒有'>'字符。 – Amber 2009-09-01 21:19:57

+0

當然,除非你想匹配語法等價的。 – 2009-09-01 21:36:29

+0

正確。但是,您可以再次擴展正則表達式來匹配它 - 只需在模式的'/ td>'部分之前添加'(><)?'。 – Amber 2009-09-01 23:18:29

2

正則表達式會產生嚴重的麻煩解釋雜亂的HTML一樣,是那種瀏覽器通常要處理。可以對標記進行各種各樣可怕的混淆,你只是不想考慮!

HTML Agility Pack是你真正想使用的,並且在我見過的任何地方都有非常好的評論。它是一個強大的庫,用於將任何類型的損壞的HTML讀入DOM模型。我個人認爲它是一個極好的圖書館,肯定有其他圖書館,許多人在商業應用環境中使用圖書館。