Страницы

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

четверг, 9 апреля 2020 г.

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

#java #регулярные_выражения

                    
Вот задание:

Вывести на консоль все теги, которые соответствуют заданному тегу Каждый тег на новой
строке, порядок должен соответствовать порядку следования в файле Количество пробелов,
\n, \r не влияют на результат Файл не содержит тег 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



В вашем регулярном выражении: (?=((?:(?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 Что вполне соответствует требуемому от правильного решения.

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

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