我将是第一个承认我的正则表达式知识毫无希望的人。我正在使用带有以下
的javaMatcher 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>
。
干杯。
答案 0 :(得分:2)
您是否考虑过使用capturing group?
Pattern.compile(">([^<>]*)</a>")
但是请注意,通常不推荐使用HTML的正则表达式,因为HTML不是常规的。通过使用JTidy等HTML解析器,您将获得更可靠的结果。
答案 1 :(得分:2)
请记住,由于其性质有限,如果您尝试解析的HTML稍微复杂一些,那么正则表达式(以及一般的正则表达式)可能会遇到问题。例如,以下内容无法正确解析,但完全有效(和常见)HTML:
<a href="blah.html">this is only a <em>single</em> link</a>
您可能最好使用DOM解析器(我很确定Java在这方面有很多选项),然后您可以请求每个<a>
标记的内部文本。
答案 2 :(得分:2)
您可以通过在正则表达式的该部分周围打包一个组,然后使用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
答案 3 :(得分:1)
我迟到了,但我想指出另一个选择:
(?<=X) X, via zero-width positive lookbehind
如果你把你的初始>
放入那个混乱中,即
(?<=>)[^<>]*</a>
然后不应该将其作为结果的一部分返回。
但是,未经测试。祝你好运!答案 4 :(得分:0)
测试正则表达式的一种很好的快速方法是使用正则表达式编辑器,例如以下eclipse插件: http://brosinski.com/regex/