Почему этот код не возвращается? Какое регулярное выражение следует использовать для замены всех тегов из html файла?
x = x.replaceAll("<.*>", "<h3><a href=\"#\">current community</a></h3>");
Благодарю!
Отказ от ответственности: вы не должны использовать регулярное выражение для анализа 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]*?
)
)
)
)
>
Я хочу удалить теги HTML
Вы можете просто использовать библиотеку разбора HTML, такую как JSoup
. Вот пример
Document doc =
Jsoup.parse("<html><h3><a href=\"#\">current community</a></h3></html>");
System.out.println(doc.text());
Вывод:
current community
Я соглашусь со всеми, что попытка использовать регулярное выражение для анализа 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 регулярное выражение, которое я выбрал, не является ни одним из указанных выше, так как вы не должны использовать регулярные выражения для синтаксического анализа сложных структур.