Все предлагаемые решения соответствуют второму
, но это не так. Что делать, если есть два последовательных элемента
без закрывающих тегов? Второе совпадение не будет найдено, потому что первое совпадение использовало свой открывающий тег. Вы можете избежать этой проблемы, используя прогноз, как я сделал здесь:
@"<p\b(?>(?:[^<]+|<(?!/?p>))*)(?=<p\b|$)"
Что касается остального, я использовал технику «не начальный или не остальной» вместе с атомарной группой, чтобы привести регулярное выражение к совпадению настолько эффективно, насколько это возможно (и, что более важно, провалиться так же быстро, как возможно, если это будет).