#java #regex
#java #регулярное выражение
Вопрос:
В настоящее время я сталкиваюсь с проблемой, когда
<a href="<a href="http://www.freeformatter.com/xml-formatter.html#ad-output" target="_blank">http://www.freeformatter.com/xml-formatter.html#ad-output</a>">Links</a>
Возвращается из службы, которую я использую. Как вы можете видеть, это недопустимый html. Кто-нибудь знает какие-либо инструменты или регулярные выражения, которые могут помочь мне удалить внутренний тег, чтобы изменить его на это:
<a href="http://www.freeformatter.com/xml-formatter.html#ad-output">Links</a>
Редактировать:
Служба не всегда возвращает freeformatter.com веб-сайт. Он может возвращать ЛЮБОЙ веб-сайт
Комментарии:
1. вы пробовали что-нибудь до сих пор?
2. Сообщите об этом поставщику услуг.
3. Я пытался использовать инструмент Java.split и вручную изменять его, но мои решения кажутся слишком сложными и неуклюжими. Сообщит поставщику услуг, но на самом деле у него нет времени ждать, пока они внесут свои изменения
4. хорош ли jsoup для синтаксического анализа недопустимого html?
Ответ №1:
Если URL-адрес или содержимое в тегах изменятся, возможно, вам захочется использовать более обобщенный шаблон:
(<a\shref="\w. ")\s. >"(. </a>)
Это, по сути, объединяет нужные части строки в две группы; которые затем могут быть собраны в одну строку. Вот рабочий пример:
Комментарии:
1. Спасибо, это именно то, что я искал. Не очень хорошо работает с регулярными выражениями, так что это очень помогает.
Ответ №2:
В Java:
String s = "<a href="<a href="http://www.freeformatter.com/xml-formatter.html#ad-output" target="_blank">http://www.freeformatter.com/xml-formatter.html#ad-output</a>">Links</a>;
(Вам нужно как-то сохранить его в виде строки в вашей программе)
Затем:
s = s.replace("<a href="", "");
String[] pcs = s.split("http://www.freeformatter.com/xml-formatter.html#ad-output</a>">");
s = pcs[0] pcs[1];
s = s.replace(" target="_blank"", "");
После всей этой обработки у вас будет правильная ссылка.
Комментарии:
1. о, извините, я не был ясен. Это может быть www.xxx . Не обязательно freeformatter.com
Ответ №3:
возьмите первый a href=» с .substring(0,8), затем используйте .split(«»>»,1) и используйте полученный массив с индексом 1.
Ответ №4:
Решение 1
Просто используйте функцию группировки регулярного выражения, которая фиксируется круглыми скобками ()
. Получите соответствующую группу, используя Matcher.group()
метод.
Найдите все вхождения между > и < и объедините их в соответствии с вашими потребностями.
Вот шаблон регулярных >([^">].*?)<
выражений. Взгляните на демонстрацию debuggex и regex101
Описание шаблона:
. Any character (may or may not match line terminators)
[^abc] Any character except a, b, or c (negation)
X*? X, zero or more times (Reluctant quantifiers)
(X) X, as a capturing group
Подробнее о
Пример кода:
String string = "<a href="<a href="http://www.freeformatter.com/xml-formatter.html#ad-output" target="_blank">http://www.freeformatter.com/xml-formatter.html#ad-output</a>">Links</a>";
Pattern p = Pattern.compile(">([^">].*?)<");
Matcher m = p.matcher(string);
while (m.find()) {
System.out.println(m.group(1));
}
вывод:
http://www.freeformatter.com/xml-formatter.html#ad-output
Links
Решение 2
Попробуйте String#replaceAll()
использовать метод с использованием (</a>)[^$]|([^^]<a(.*?)>)
шаблона регулярных выражений.
Шаблон гласит: замените все </a>
, что не в конце, и <a.*?>
что не в начале, двойными кавычками.
Найдите демонстрацию в regex101 и debuggex
Наглядное представление этого шаблона регулярных выражений:
Пример кода:
String string = "<a href="<a href="http://www.freeformatter.com/xml-formatter.html#ad-output" target="_blank">http://www.freeformatter.com/xml-formatter.html#ad-output</a>">Links</a>";
System.out.println(string.replaceAll("(</a>)[^$]|([^^]<a(.*?)>)", """));
вывод:
<a href="http://www.freeformatter.com/xml-formatter.html#ad-output">Links</a>