2009-05-27 34 views
0

我有在一個ASP.Net應用以下VB.Net 2.0:淨正則表達式匹配的分組和重複問題

output = Regex.Replace(output, "<p>(?:(?:\<\!\-\-.*?\-\-\>)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p>", String.Empty, RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Singleline) 

實施例的東西它匹配良好:

  • <p></p>
  • <p> </p>
  • <p><br/><br/></p>
  • <p><!-- comment --><!-- comment --></p>
  • <p>&nbsp;&nbsp;</p>
  • <p><br/>&nbsp;</p>
  • <p><!-- comment --><br/><!-- comment --></p>
  • 的東西
  • <p>&nbsp;<br/></p>

例子我想匹配,但它並不:

  • <p > <!--[if !supportLineBreakNewLine]--><br /> <!--[endif]--></p>

我如何讓羣組和重複功能按照我的要求工作?

編輯:哎呀,忘了評論組。 編輯#2:哎呀,忘了失敗。 編輯#3:固定的例子。 編輯#4:更新的正則表達式基於答案

結論:

這裏是我的全部三個答案基準結果。由於三個匹配現在的一切,我跑了每一個通過10,000次重複文本塊:

Mine: 
<p\s*>(?:(?:<!--.*?-->)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p> 
6.312 

Gumbo: 
<p\s*>(?:[\s\u00A0]+|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|<!--(?:[^-]+|-(?!-))*-->)*</p> 
6.05 

steamer25: 
<p\s*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p> 
6.121 

濃湯的是最快的,所以我會紀念他爲正確答案。

+0

你在做什麼? – 2009-05-27 21:19:28

+0

我試圖從html內容中剝離所有P標籤,這些標籤只包含:html註釋,不間斷空格,BR元素或空白字符。 – travis 2009-05-27 21:33:17

回答

1

試試這個正則表達式:

<p\s*>(?:[\s\u00A0]+|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|<!--(?:[^-]+|-(?!-))*-->)*</p> 
+0

似乎錯過了一個')'的地方 – travis 2009-05-27 21:25:46

1
<p\s*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p> 

你不需要逃避尖括號<>和我添加了註釋。

1

UGH!我看到我的問題,這是在P標籤本身,而不是分組。

<p\s*>(?:(?:<!--.*?-->)|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|[\s\u00A0]+)*</p> 

注意標籤中的\ s *。所有的積分!