.NET регулярные выражения в бесконечном цикле - PullRequest
1 голос
/ 27 ноября 2008

Я использую регулярные выражения .NET для удаления кода HTML.

Используя что-то вроде:

<title>(?<Title>[\w\W]+?)</title>[\w\W]+?<div class="article">(?<Text>[\w\W]+?)</div>

Это работает в 99% случаев, но иногда при разборе ...

Regex.IsMatch(HTML, Pattern)

Парсер просто блокируется, и он будет продолжать работать с этой строкой кода в течение нескольких минут или неопределенно долго.

Что происходит?

Ответы [ 3 ]

6 голосов
/ 27 ноября 2008

Ваше регулярное выражение будет работать нормально, если ваша HTML-строка на самом деле содержит HTML, который соответствует шаблону. Но когда ваш HTML не соответствует шаблону, например если последний тег отсутствует, ваше регулярное выражение покажет то, что я называю " катастрофический возврат " Нажмите на эту ссылку и прокрутите вниз до раздела «Быстрое сопоставление полного HTML-файла». Это точно описывает вашу проблему. [\ Ш \ W] +? это сложный способ сказать. +? с RegexOptions.SingleLine.

3 голосов
/ 27 ноября 2008

С некоторыми усилиями вы можете заставить regex работать на html - однако, вы смотрели на пакет agility HTML ? Это значительно облегчает работу с html в качестве DOM, с поддержкой запросов типа xpath и т. Д. (Т.е. "//div[@class='article']").

1 голос
/ 27 ноября 2008

Вы просите своего регулярного выражения сделать там много. После каждого символа он должен смотреть вперед, чтобы понять, можно ли сопоставить следующий бит текста со следующей частью шаблона.

Regex - это инструмент сопоставления с образцом. Хотя вы можете использовать его для простого синтаксического анализа, вам лучше использовать определенный анализатор (например, пакет Agility для HTML, как уже упоминалось в моем Marc).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...