У меня есть следующее VB.Net 2.0 в приложении ASP.Net:
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>
Как заставить группы и повторы работать так, как я хочу?
Редактировать: упс, забыл группу комментариев.
Edit # 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*>(?:(?:\ \;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>
6.121
Гамбо был самым быстрым, поэтому я отмечу его как правильный ответ.