java - 正则表达式提取链接内容

标签 java regex

我会第一个承认我的 Regex 知识是无用的。我正在将 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> .

干杯。

最佳答案

您可以通过围绕正则表达式的那部分包装一个组然后使用 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

关于java - 正则表达式提取链接内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1737118/

相关文章:

java - 使用 Mockito 模拟枚举?

java - 如何使用 Maven 包含 JavaParser 依赖项?

java - 重写对象类的compareTo方法

java - 使用 java swing 创建与 Oracle 10g 的 JDBC 连接

c# - 使用正则表达式查找 block 内的文本

javascript - 使用 Javascript 通过正则表达式过滤数组

php - 自然数范围问题

Java Thread.sleep() 无法正常工作,为什么?

python - 正则表达式中的半空格

java - Java 正则表达式中 matches() 和 find() 之间的区别