我会第一个承认我的 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/