Nano Hash - криптовалюты, майнинг, программирование

Используйте REGEX для поиска содержимого HTML ListItem (.NET)

Используя следующий текст в качестве образца, мне нужно иметь возможность извлекать текст между тегами LI. Обратите внимание, что первый LI намеренно неправильно сформирован, поскольку это может иметь место. Другими словами, я хочу все, от тега LI до закрывающего тега LI или следующего открывающего тега LI.

    <UL>
<LI class="test">This is the first ListItem Text. 
<LI>This is the second ListItem Test. </LI></UL>

Пока что я придумал:

<[Ll][Ii].*>(.*?)((?:<[Ll][Ii]>)|(?:</[Ll][Ii]>))

Но это похоже на совпадение первого тега LI до закрывающего тега как одно совпадение с группой, являющейся текстом 2-го тега LI. Мне удалось вернуть первый набор, но не оба. Я также использую опцию «Точка соответствует новой строке», и это .NET, для которой мне нужно, чтобы она работала. Спасибо!

ОБНОВЛЕНИЕ

Перед тем, как опубликовать этот вопрос, я провел некоторое исследование и действительно увидел и понял, что использование регулярных выражений для синтаксического анализа html - плохая идея. При этом мне нужно только иметь возможность получать текст из пары тегов LI здесь и там, чтобы определить, какой текст выделить на слайде PowerPoint. Я подумал, что может быть более простой способ сделать это, чем иметь дело с отдельной библиотекой, особенно когда сложно использовать сторонние библиотеки там, где я работаю. К сожалению, похоже, что HTML может иметь неправильный формат в определенных ситуациях при использовании поля ввода html форматированного текста на странице, которое позволяет маркировать текст. Спасибо за все рекомендации против использования REGEX для синтаксического анализа HTML. Я должен был заранее указать, что я уже прочитал много подобных советов, но искал быстрое решение для простого стечения обстоятельств.

21.04.2009

Ответы:


1

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

Вот один, который я нашел с помощью базового поиска Google:
http://www.netomatix.com/products/Documentmanagement/HtmlParserNet.aspx

ОБНОВЛЕНИЕ:

Вот несколько связанных сообщений на StackOverflow:
Как вы проанализировать плохо отформатированный файл HTML?
Как лучше всего анализировать HTML на C #?

21.04.2009
  • Хотя это не совсем то решение / путь, который я хотел выбрать для этого, я признаю, что это действительно ПРАВИЛЬНЫЙ ответ. Спасибо. 27.05.2009

  • 2

    Как сказал Славяно, это сложно. Приведенный вами пример особенно сложен, потому что второй «<LI>» нужно рассматривать как закрывающий тег для первого совпадения, так и как открывающий тег для второго. Это трудно.

    Совершенно не связанное с этим примечание: вы можете установить флаги регулярных выражений без учета регистра, чтобы вам не приходилось делать [Ll][Ii] и т. Д.

    21.04.2009

    3

    Я чувствую себя сломанной виниловой пластинкой, но: не используйте регулярные выражения для синтаксического анализа нерегулярных языков.

    Доступно множество анализаторов .NET HTML, некоторые из них также могут исправлять искаженный HTML. Я погуглил ".net html parser malformed" и, похоже, есть некоторые многообещающие результаты.

    21.04.2009

    4

    Регулярные выражения плохо разбираются в HTML (см. Можете ли вы привести несколько примеров того, почему трудно анализировать XML и HTML с помощью регулярного выражения? для Зачем). Вам нужен синтаксический анализатор HTML, например Html Agility Pack.

    21.04.2009

    5

    Попробуй это.

    <li.*?>(.*?)(?=</li>|<li.*?>|</ul>|\Z)
    

    Обратите внимание, что вам нужно использовать параметр RegexOptions.IgnoreCase, чтобы это работало, но оно делает ваше выражение более читабельным.

    21.04.2009
  • Это сломается, если оба ‹/li› и ‹/ul› отсутствуют. 21.04.2009
  • @Tomalak: он также должен подбирать текст к следующему тегу ‹li›, по запросу, и даже остальную часть строки, если больше нет тегов ‹/li›, ‹li› или ‹/ul›. Выглядит именно так, как задан вопрос. 21.04.2009
  • @Whatsit: я не признаю требование соответствия до конца ввода в вопросе. Где ОП говорит это? 21.04.2009
  • @Tomalak: Они этого не сделали, поэтому я полагаю, что технически это не в точности то, о чем они просили, но я ожидал, что это то, чего они хотят 21.04.2009

  • 6

    Если ваш ввод достаточно правильный (и элементы списка содержат только текст), вам может сойти с рук:

    <li[^>]*>([^<]*)
    

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

    Результат потребует некоторой нормализации (обрезка, замена новой строки).

    21.04.2009
  • Тем не менее - Regex плохо подходит для синтаксического анализа HTML, как говорили некоторые другие. Вот почему я сказал, что может сойти с рук. 21.04.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..