我在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> </p>
<p><br/> </p>
<p><!-- comment --><br/><!-- comment --></p>
<p> <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*>(?:(?:\ \;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>
6.121
Gumbo是最快的,所以我会将他标记为正确答案。
答案 0 :(得分:1)
试试这个正则表达式:
<p\s*>(?:[\s\u00A0]+|&(?:nbsp|\#0*160|x0*A0);|<br\s*/?>|<!--(?:[^-]+|-(?!-))*-->)*</p>
答案 1 :(得分:1)
<p\s*>(?:(?:\ \;)|(?:\&\#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 *。所有人的要点!