Java регулярное выражение для соответствия указанному c url в строке html - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно получить значение между двойными кавычками href ("), которое соответствует указанному шаблону c, я пробовал описанное выше, но не могу понять, что не так. Когда я нахожу шаблон в одной строке несколько раз Я получаю огромную группу с информацией, которая мне не нужна:

href="(/namehere/nane2here/(option1|option2).*)"

Мне нужна группа между скобками. Этот шаблон повторяется много раз в строке, они все в одном строка.

Пример строки, из которой я пытаюсь получить значения:

<div>adasdsda<div>...lots of tags here... <a ... href="/name/name/option1/data1/data2"...anything here ...">src</a>...others HTML text here...<a ... href="/name/name/option2/data1"...

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Прежде всего, не используйте регулярное выражение для всей структуры HTML. Чтобы узнать, почему, посетите:

Вместо этого попробуйте проанализировать структуру HTML на объект, представляющий DOM, который позволит нам легко перемещаться по всем элементам и найдите те, которые нас интересуют.

Один из (IMO) самых простых в использовании парсеров HTML можно найти по адресу https://jsoup.org/. Его большой плюс - поддержка синтаксиса селектора CSS для поиска элементов. Он описан в https://jsoup.org/cookbook/extracting-data/selector-syntax, где мы можем найти

[attr~=regex]: элементы со значениями атрибутов, которые соответствуют регулярному выражению; например,
img[src~=(?i)\.(png|jpe?g)]

Короче, [attr~=regex] позволит нам финансировать любой элемент, значение указанного атрибута которого может быть , даже частично , совпадающим с регулярным выражением.

Здесь ваш код может выглядеть примерно так:

String yourHTML =
        "<div>" +
        "   <a href='abc/def/1'>foo</a>" +
        "   <a href='abc/fed/2'>bar</a>" +
        "   <a href='abc/ghi/3'>bam</a>" +
        "</div>";
Document doc = Jsoup.parse(yourHTML);
Elements elementsWithHref = doc.select("a[href~=^abc/(def|fed)]");
for (Element element : elementsWithHref){
    String href = element.attr("href");
    System.out.println(href);
}

Вывод:

abc/def/1
abc/fed/2

(обратите внимание, что abc/ghi/3 нет, так как ^abc/(def|fed) не может быть в нем нашел )

0 голосов
/ 19 июня 2020

\ b используется для сопоставления границы слова

href="(/namehere/nane2here/(\\boption1\\b)|(\\boption2\\b).*)"
0 голосов
/ 19 июня 2020

Попробуйте "(?si)<[\\w:]+(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\\s)href\\s*=\\s*(?:(['\"])\\s*((?:(?!\\1).)*?/namehere/nane2here/(?:option1|option2)(?:(?!\\1).)*)\\s*\\1))\\s+(?:\".*?\"|'.*?'|[^>]*?)+>"

демонстрация

функция:

  • находит определенное c значение href, содержащееся в любом теге
  • группа 1 содержит разделитель
  • группа 2 содержит href значение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...