.Net正则表达式匹配分组和重复问题

时间:2009-05-27 21:07:49

标签: .net asp.net vb.net regex asp.net-2.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>

如何让小组和重复按我希望的方式工作?

编辑: oops,忘记了评论组。 编辑#2: oops,忘了失败。 修改#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

Gumbo是最快的,所以我会将他标记为正确答案。

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

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

答案 1 :(得分:1)

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

您无需转义尖括号&lt;&gt;我添加了评论。

答案 2 :(得分:1)

UGH!我看到了我的问题,它出现在P标签本身,而不是分组。

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

注意标签中的\ s *。所有人的要点!