Regex для извлечения содержания ссылки - PullRequest
1 голос
/ 15 ноября 2009

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

Matcher m = Pattern.compile(">[^<>]*</a>").matcher(html);
while (m.find()) {
 resp.getWriter().println(html.substring(m.start(), m.end()));
}

Я получаю следующий список:

>Link Text a</a>
>Link Text b</a>

Чего мне не хватает, чтобы удалить > и </a>.

Приветствие.

Ответы [ 5 ]

2 голосов
/ 15 ноября 2009

Имейте в виду, что из-за ограниченности вашего регулярного выражения (и регулярного выражения в целом) могут возникнуть проблемы, если HTML-код, который вы пытаетесь проанализировать, немного сложнее. Например, следующее не сможет правильно проанализировать, но это полностью допустимый (и распространенный) HTML:

<a href="blah.html">this is only a <em>single</em> link</a>

Возможно, вам лучше использовать синтаксический анализатор DOM (я уверен, что в Java есть много вариантов в этом отношении), чтобы вы могли затем запросить внутренний текст каждого тега <a>.

2 голосов
/ 15 ноября 2009

Вы можете сделать это, обернув группу вокруг этой части регулярного выражения, а затем используя group(X), где X - номер группы:

Matcher m = Pattern.compile(">([^<>]*)</a>").matcher(html);
while (m.find()) {
 resp.getWriter().println(m.group(1));
}

Но лучше было бы использовать для этого простой парсер:

import java.io.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class HtmlParseDemo {
   public static void main(String [] args) throws Exception {
       Reader reader = new StringReader("foo <a href=\"#\">Link 1</a> bar <a href=\"#\">Link <b>2</b> more</a> baz");
       HTMLEditorKit.Parser parser = new ParserDelegator();
       parser.parse(reader, new LinkParser(), true);
       reader.close();
   }
}

class LinkParser extends HTMLEditorKit.ParserCallback {

    private boolean linkStarted = false;
    private StringBuilder b = new StringBuilder();

    public void handleText(char[] data, int pos) {
        if(linkStarted) b.append(new String(data));
    }

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        if(t == HTML.Tag.A) linkStarted = true;
    }

    public void handleEndTag(HTML.Tag t, int pos) {
        if(t == HTML.Tag.A) {
            linkStarted = false;
            System.out.println(b);
            b = new StringBuilder();
        }
    }
}

Выход:

Link 1
Link 2 more
2 голосов
/ 15 ноября 2009

Вы смотрели на использование группы захвата ?

Pattern.compile(">([^<>]*)</a>")

Обратите внимание, что обычно не рекомендуется использовать регулярные выражения для HTML, поскольку HTML не является регулярным Вы получите более надежные результаты, используя HTML-анализатор, такой как JTidy .

1 голос
/ 15 ноября 2009

Я опаздываю на вечеринку, но я бы хотел указать на другую альтернативу:

(?<=X)      X, via zero-width positive lookbehind

Если вы положили свои первые > в этот беспорядок, т.е.

(?<=>)[^<>]*</a>

тогда оно не должно возвращаться как часть вашего результата.

Не проверено, хотя. Удачи!

0 голосов
/ 15 ноября 2009

Хороший быстрый способ проверить ваши регулярные выражения, это использовать редактор регулярных выражений, такой как следующий плагин eclipse: http://brosinski.com/regex/

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