Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

Почему регулярное выражение выбрасывает исключение?

Вот задание:
Вывести на консоль все теги, которые соответствуют заданному тегу Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле Количество пробелов,
,
не влияют на результат Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нету Тег может содержать вложенные теги
Вот шаблоны тэгов из задания:
text1 text1 text1
text1, text2 могут быть пустыми
Ввод такой:
string1 string2 string11
Вывод должен быть таким:
string1 string2 string11 string2
Какой регэксп для этого нужен? Вот мой тестировочный код:
public class Solution {
public static void main(String[] args) {
String testStr = "string1 string2 string11";
Pattern p = Pattern.compile("(\\<(/?[^\\>]+)\\>)"); Matcher m = p.matcher(testStr);
while(m.find()) { System.out.println(testStr.substring(m.start(), m.end())); }
} }
И ответ к нему.
(?=((?:(?1)|<(?!/span>)|[^<]+)+))
Но у меня не получается "прикрутить"
Pattern p = Pattern.compile("(?=((?:(?1)|<(?!/span>)|[^<]+)+))");
пишет вот такое:
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0 ?=(<(span)>(?:(?1)|<(?!/\2>)|[^<]+)+)
Подскажите как адаптировать регулярку под мою задачу?


Ответ

В вашем регулярном выражении:
(?=((?:(?1)|<(?!/span>)|[^<]+)+))
Определение группы захвата (?1) не является корректным с точки зрения синтаксиса регулярных выражений в JAVA, т.к. рекурсивные паттеры из PHP PCRE в ней не поддерживаются - ошибка выдаётся именно из-за этого

Вашу задачу необходимо решать с использованием HTML-парсера, например jsoup
String html = "string1 string2 string11"; String tag = "span";
Document document = Jsoup.parse(html);
document.select(tag).forEach((element) -> { System.out.println(element.outerHtml()); });
Этот код выводит:
string1 string2 string11 string2
Что вполне соответствует требуемому от правильного решения.

Комментариев нет:

Отправить комментарий