Вопрос о группировке и повторении совпадений .Net Regex - PullRequest
0 голосов
/ 28 мая 2009

У меня есть следующее 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>&nbsp;&nbsp;</p>
  • <p><br/>&nbsp;</p>
  • <p><!-- comment --><br/><!-- comment --></p>
  • <p>&nbsp;<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*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>
6.121

Гамбо был самым быстрым, поэтому я отмечу его как правильный ответ.

Ответы [ 3 ]

1 голос
/ 28 мая 2009
<p\s*>(?:(?:\&nbsp\;)|(?:\&\#0*160\;)|(?:<br\s*/?>)|\s|\u00A0|<!\-\-[^(?:\-\-)]*\-\->)*</p>

Вам не нужно экранировать угловые скобки <>, и я добавил комментарии.

1 голос
/ 28 мая 2009

UGH! Я вижу свою проблему, она была в самом теге P, а не в группировке.

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

Обратите внимание на \ s * в теге. Очки для всех!

1 голос
/ 28 мая 2009

Попробуйте это регулярное выражение:

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