本文目录导读:

我来详细解释一下 JEditorPane、HTMLEditorKit 中的解析器方法模式匹配。
核心组件
JEditorPane
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setText("<html><body><p>Hello World</p></body></html>");
HTMLEditorKit
HTMLEditorKit kit = new HTMLEditorKit(); editor.setEditorKit(kit);
解析器相关类
HTMLEditorKit.ParserHTMLEditorKit.ParserCallback
模式匹配方法
基本解析器模式匹配示例
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;
public class HTMLParserPattern {
public static void main(String[] args) {
String html = "<html><body>" +
"<h1>标题</h1>" +
"<p>段落文本</p>" +
"<a href='http://example.com'>链接</a>" +
"<img src='image.jpg' alt='图片'/>" +
"</body></html>";
try {
// 方法1: 使用HTMLEditorKit的解析器
parseWithHTMLEditorKit(html);
// 方法2: 使用ParserDelegator
parseWithParserDelegator(html);
} catch (Exception e) {
e.printStackTrace();
}
}
// 方法1: HTMLEditorKit方式
static void parseWithHTMLEditorKit(String html) throws Exception {
HTMLEditorKit kit = new HTMLEditorKit();
HTMLEditorKit.Parser parser = kit.getParser();
StringReader reader = new StringReader(html);
parser.parse(reader, new HTMLEditorKit.ParserCallback() {
@Override
public void handleText(char[] data, int pos) {
String text = new String(data);
System.out.println("文本: " + text);
// 模式匹配示例
if (text.matches(".*标题.*")) {
System.out.println(" -> 匹配标题模式");
}
if (text.contains("段落")) {
System.out.println(" -> 包含段落关键词");
}
}
@Override
public void handleStartTag(HTML.Tag tag, MutableAttributeSet attrs, int pos) {
System.out.println("开始标签: " + tag);
// 标签模式匹配
if (tag == HTML.Tag.A) {
String href = (String) attrs.getAttribute(HTML.Attribute.HREF);
if (href != null && href.matches("https?://.*")) {
System.out.println(" -> 匹配URL模式: " + href);
}
}
if (tag == HTML.Tag.IMG) {
String src = (String) attrs.getAttribute(HTML.Attribute.SRC);
if (src != null && src.matches(".*\\.(jpg|png|gif)$")) {
System.out.println(" -> 匹配图片路径模式: " + src);
}
}
}
}, false);
}
// 方法2: ParserDelegator方式
static void parseWithParserDelegator(String html) throws Exception {
ParserDelegator parser = new ParserDelegator();
StringReader reader = new StringReader(html);
parser.parse(reader, new ParserDelegator.HTMLParserCallback() {
@Override
public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet attrs, int pos) {
System.out.println("自闭合标签: " + tag);
// 模式匹配
if (tag == HTML.Tag.IMG) {
String alt = (String) attrs.getAttribute(HTML.Attribute.ALT);
if (alt != null && !alt.isEmpty()) {
System.out.println(" -> 图片描述: " + alt);
}
}
}
}, true);
}
}
高级模式匹配示例
正则表达式模式匹配
public class RegexPatternMatcher {
// 匹配HTML标签
private static final Pattern TAG_PATTERN =
Pattern.compile("<([a-zA-Z]+)[^>]*>");
// 匹配属性
private static final Pattern ATTRIBUTE_PATTERN =
Pattern.compile("(\\w+)=[\"']?([^\"'>]+)[\"']?");
// 匹配URL
private static final Pattern URL_PATTERN =
Pattern.compile("https?://[^\\s\"'<>]+");
public static void matchPatterns(String html) {
// 标签匹配
Matcher tagMatcher = TAG_PATTERN.matcher(html);
while (tagMatcher.find()) {
System.out.println("发现标签: " + tagMatcher.group(1));
}
// 属性匹配
Matcher attrMatcher = ATTRIBUTE_PATTERN.matcher(html);
while (attrMatcher.find()) {
System.out.println("属性: " + attrMatcher.group(1) +
" = " + attrMatcher.group(2));
}
}
}
自定义回调模式匹配
class CustomPatternMatcher extends HTMLEditorKit.ParserCallback {
// 模式匹配规则
private List<PatternRule> rules = new ArrayList<>();
public CustomPatternMatcher() {
// 定义匹配规则
rules.add(new PatternRule("标题", PatternType.TEXT_MATCH));
rules.add(new PatternRule("https?://", PatternType.URL_MATCH));
rules.add(new PatternRule("\\d{4}-\\d{2}-\\d{2}", PatternType.DATE_MATCH));
}
@Override
public void handleText(char[] data, int pos) {
String text = new String(data);
for (PatternRule rule : rules) {
if (rule.matches(text)) {
System.out.println("匹配规则 '" + rule.pattern + "': " + text);
}
}
}
@Override
public void handleStartTag(HTML.Tag tag, MutableAttributeSet attrs, int pos) {
if (tag == HTML.Tag.A) {
String href = (String) attrs.getAttribute(HTML.Attribute.HREF);
if (href != null && href.startsWith("http")) {
System.out.println("外部链接: " + href);
}
}
}
// 模式规则内部类
static class PatternRule {
String pattern;
PatternType type;
PatternRule(String pattern, PatternType type) {
this.pattern = pattern;
this.type = type;
}
boolean matches(String text) {
switch (type) {
case TEXT_MATCH:
return text.contains(pattern);
case URL_MATCH:
return text.matches(pattern + ".*");
case DATE_MATCH:
return text.matches(pattern);
default:
return false;
}
}
}
enum PatternType {
TEXT_MATCH,
URL_MATCH,
DATE_MATCH
}
}
使用模式匹配的实用函数
public class HTMLPatternUtils {
// 提取所有链接
public static List<String> extractLinks(String html) {
List<String> links = new ArrayList<>();
Pattern linkPattern = Pattern.compile(
"<a\\s+[^>]*href=[\"']([^\"']+)[\"'][^>]*>"
);
Matcher matcher = linkPattern.matcher(html);
while (matcher.find()) {
links.add(matcher.group(1));
}
return links;
}
// 提取所有图片
public static List<String> extractImages(String html) {
List<String> images = new ArrayList<>();
Pattern imgPattern = Pattern.compile(
"<img\\s+[^>]*src=[\"']([^\"']+)[\"'][^>]*>"
);
Matcher matcher = imgPattern.matcher(html);
while (matcher.find()) {
images.add(matcher.group(1));
}
return images;
}
// 清理HTML标签
public static String stripHTML(String html) {
return html.replaceAll("<[^>]*>", "")
.replaceAll("\\s+", " ")
.trim();
}
// 检查特定模式
public static boolean containsPattern(String html, String pattern) {
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(html);
return m.find();
}
}
关键要点
-
解析器选择:
HTMLEditorKit.Parser- 用于Swing组件ParserDelegator- 更灵活的解析方式
-
模式匹配方法:
- 字符串匹配 (
contains,matches) - 正则表达式匹配
- 标签属性匹配
- 字符串匹配 (
-
回调处理:
handleText()- 处理文本内容handleStartTag()- 处理开始标签handleEndTag()- 处理结束标签handleSimpleTag()- 处理自闭合标签
这个框架提供了强大的HTML解析和模式匹配能力,可以根据需求实现复杂的HTML内容分析和处理。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播