Java Regex - Извлечение ссылки из якоря HTML - PullRequest
1 голос
/ 28 февраля 2012

У меня есть следующий код

private String anchorRegex = "\\<\\s*?a\\s+.*?href\\s*?=\\s*?([^\\s]*?).*?\\>";
private Pattern anchorPattern = Pattern.compile(anchorRegex, Pattern.CASE_INSENSITIVE);
String content = getContentAsString();
Matcher matcher = anchorPattern.matcher(content);

while(matcher.find()) {
    System.out.println(matcher.group(1));
}

Вызов getContentAsString() возвращает содержимое HTML с веб-страницы.У меня проблема в том, что единственное, что печатается в моем System.out - это пробел.Кто-нибудь может увидеть, что не так с моим регулярным выражением?

Регулярное выражение иногда сводит меня с ума.

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

регулярное выражение, которое вы должны использовать, это:

String anchorRegex = "(?s)<\\s*a\\s+.*?href\\s*=\\s*['\"]([^\\s>]*)['\"]";
1 голос
/ 28 февраля 2012

Вам необходимо отделить свою группу захвата от следующего .*?. Вероятно, двойные кавычки " вокруг href, так что используйте их:

<\s*a\s+.*?href\s*=\s*"(\S*?)".*?>

Ваше регулярное выражение содержит:

([^\s]*?).*?

([^\s]*?) говорит, что неохотно находит все непробельные символы и сохраняет их в группе. Но нежелательный *? зависит от следующей части, которая является .; любой персонаж. Таким образом, сопоставление href прерывается при первой возможности, и это .*?, который соответствует остальной части URL.

0 голосов
/ 28 февраля 2012

Это должно быть в состоянии вытащить href без особых проблем.
Ссылка находится в группе захвата 2, она развернута и предполагает многоточие.
При необходимости используйте разделители Java.

(?s)
<a 
  (?=\s) 
  (?:[^>"']|"[^"]*"|'[^']*')*? (?<=\s) href \s*=\s* (['"]) (.*?) \1 
  (?:".*?"|'.*?'|[^>]*?)+ 
>

или не расширен, не точка-все.

<a(?=\s)(?:[^>"']|"[^"]*"|'[^']*')*?(?<=\s)href\s*=\s*(['"])([\s\S]*?)\1(?:"[\s\S]*?"|'[\s\S]*?'|[^>]*?)+>

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