Извлечение строки из определенного тега с использованием java - PullRequest
2 голосов
/ 05 августа 2020

У меня несколько тегов внутри html. Как вы можете видеть ниже, HTML имеет <AT></AT>. Поэтому мне нужно извлечь текст из <AT></AT> this tag.

Я следовал нижеприведенному подходу

  1. Написал одно регулярное выражение, которое будет извлекать текст из тега AT

Ниже приведена тестовая строка:

href="<AT>EXTRACT_URL</AT>" target="_blank" style="font-weight: bold;letter-spacing: normal;line-height: 100%;text-align: center;text-decoration: none;color: #FFFFFF;">Sign In</a></td></tr></tbody></table></td></tr> <a href="<AT>EXTRACT_URL</AT>" target="_blank" title="" class="" target="_blank"> <a href="<AT>EXTRACT_URL</AT>" target="_blank" title="" class="" target="_blank"> <a href="<AT>EXTRACT_URL</AT>" target="_blank" title="" class="" target="_blank">

Используемая ниже программа для извлечения текста из тега AT

private static final Pattern TAG_REGEX = Pattern.compile("<AT>(.*)</AT>");

public static String getText(String text) {
    final Matcher matcher = TAG_REGEX.matcher(text);

    while (matcher.find()) {
        String url = matcher.group(1);
        
        System.out.println("Extracted URL::"+url);                      
    }   
}

Получение вывода из указанной выше программы:

Extracted URL::EXTRACT_URL</AT>" target="_blank" style="font-weight: bold;letter-spacing: normal;line-height: 100%;text-align: center;text-decoration: none;color: #FFFFFF;">Sign In</a></td></tr></tbody></table></td></tr> <a href="<AT>EXTRACT_URL</AT>" target="_blank" title="" class="" target="_blank"> <a href="<AT>EXTRACT_URL</AT>" target="_blank" title="" class="" target="_blank"> <a href="<AT>EXTRACT_URL

Ожидаемый результат :

Extracted URL::EXTRACT_URL
Extracted URL::EXTRACT_URL
Extracted URL::EXTRACT_URL
Extracted URL::EXTRACT_URL

Почему я не получаю ожидаемый результат?

1 Ответ

2 голосов
/ 05 августа 2020

Это из-за Pattern

Правильный шаблон в этом случае будет

private static final Pattern TAG_REGEX = Pattern.compile("<AT>(.*?)</AT>");

Оба будут соответствовать любой последовательности символов, но

  • .* является жадным и будет соответствовать как можно большему количеству совпадений (заканчивается на последнем </AT>)
  • .*? неохотно и будет соответствовать как можно меньшему количеству

Подробнее здесь учебник

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