HTML-тег regex не работает

1

Почему этот код не возвращается? Какое регулярное выражение следует использовать для замены всех тегов из html файла?

x = x.replaceAll("<.*>", "<h3><a href=\"#\">current community</a></h3>");

Благодарю!

  • 1
    Серьезно, не разбирайте html с регулярным выражением
Показать ещё 6 комментариев
Теги:

3 ответа

2
Лучший ответ

Отказ от ответственности: вы не должны использовать регулярное выражение для анализа html.

Но, если вы настаиваете, попробуйте

Найти: "<(?:(?:/?\\w+\\s*/?)|(?:\\w+\\s+(?:(?:(?:\"[\\S\\s]*?\")|(?:'[\\S\\s]*?'))|(?:[^>]*?))+\\s*/?)|\\?[\\S\\s]*?\\?|(?:!(?:(?:DOCTYPE[\\S\\s]*?)|(?:\\[CDATA\\[[\\S\\s]*?\\]\\])|(?:--[\\S\\s]*?--)|(?:ATTLIST[\\S\\s]*?)|(?:ENTITY[\\S\\s]*?)|(?:ELEMENT[\\S\\s]*?))))>"
Заменить: ""

 <
 (?:
      (?:
           /? 
           \w+ 
           \s* 
           /? 
      )
   |  
      (?:
           \w+ 
           \s+ 
           (?:
                (?:
                     (?: " [\S\s]*? " )
                  |  (?: ' [\S\s]*? ' )
                )
             |  (?: [^>]*? )
           )+
           \s* 
           /? 
      )
   |  
      \?
      [\S\s]*? 
      \?
   |  
      (?:
           !
           (?:
                (?:
                     DOCTYPE
                     [\S\s]*? 
                )
             |  (?:
                     \[CDATA\[
                     [\S\s]*? 
                     \]\]
                )
             |  (?:
                     --
                     [\S\s]*? 
                     --
                )
             |  (?:
                     ATTLIST
                     [\S\s]*? 
                )
             |  (?:
                     ENTITY
                     [\S\s]*? 
                )
             |  (?:
                     ELEMENT
                     [\S\s]*? 
                )
           )
      )
 )
 >
  • 0
    Он работает отлично, кроме "<! DOCTYPE html>"
  • 0
    О, подожди, я включу это.
Показать ещё 1 комментарий
4

Я хочу удалить теги HTML

Вы можете просто использовать библиотеку разбора HTML, такую как JSoup. Вот пример

Document doc = 
     Jsoup.parse("<html><h3><a href=\"#\">current community</a></h3></html>");
System.out.println(doc.text());

Вывод:

current community
  • 0
    Спасибо, я попробую это решение позже, пока мне нужно что-то быстрое, Jsoup нужно скачать, я думаю.
3

Я соглашусь со всеми, что попытка использовать регулярное выражение для анализа HTML - плохая идея. (И я думаю, что это правда, даже если все, что вы делаете, это удаление тегов, такие вещи, как комментарии и !CDATA усложнят любую попытку простого решения.) Однако я считаю полезным объяснить, почему ваше решение не создало ожидаемые результаты (поскольку это относится к другим ситуациям, где регулярные выражения более подходят).

По умолчанию кванторы * и + являются жадными, что означает, что они будут соответствовать как можно большему количеству символов. Таким образом, в вашем примере:

x = x.replaceAll("<.*>", "<h3><a href=\"#\">current community</a></h3>");

Я думаю, это то, что вы имели в виду:

String x = "<h3><a href=\"#\">current community</a></h3>";
x = x.replaceAll("<.*>", "");

Когда соответствующий движок ищет ваш шаблон, он находит < как первый символ x. Затем он ищет последовательность из нуля или более символов, которая может быть чем угодно, а затем >. Но так как это жадный квантификатор, если есть выбор из более чем одного > он может выбрать, он будет выбирать тот, который делает .* Соответствует самой длинной возможной строке. В вашем случае это означает, что он выберет > который является последним символом x. Эффект заключается в том, что вся строка заменяется на "".

Чтобы он соответствовал наименьшей возможной строке, добавьте ? сделать его "неохотным квантиром":

x = x.replaceAll("<.*?>", "");

Другим решением является указание совпадению не включать > при сопоставлении "любого символа":

x = x.replaceAll("<[^>]*>", "");

[^>] означает "сопоставить любой символ, кроме >. Для HTML/XML/SGML регулярное выражение, которое я выбрал, не является ни одним из указанных выше, так как вы не должны использовать регулярные выражения для синтаксического анализа сложных структур.

  • 0
    Вы правы, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню