我有几百个具有完全相同格式的HTML文件(Pidgin IM日志文件):
<html>
<head><meta ...><title>...</title></head>
<body>
<h3>...</h3>
<font color=...><font ...>(TIME)</font> <b>(NAME):</b></font> (MESSAGE)<br/>
<font color=...><font ...>(TIME)</font> <b>(NAME):</b></font> (MESSAGE)<br/>
<font color=...><font ...>(TIME)</font> <b>(NAME):</b></font> (MESSAGE)<br/>
...
(没有关闭体/ html标签,它只是重复这些线直到EOF)
我需要从这些文件中提取时间,名称和消息。我对正则表达式并不是很好,我试过的HTML库看起来有点复杂,我正在尝试做什么。有什么建议吗?
答案 0 :(得分:0)
如果这是一个特定的需求,并且格式确实是常规的,我会用简单的indexOf
来做:
String[] lines=readFile(...);
for(String lin: lines) {
int str,end;
if((str=lin.indexOf("<font " ))!=-1
&& (str=lin.indexOf("<font " ,str))!=-1
&& (str=lin.indexOf(">" ,str))!=-1
&& (end=lin.indexOf("</font>",str))!=-1) {
str++;
time=lin.substring(str,end);
if((str=lin.indexOf("<b>" ,end))!=-1) {
&& (end=lin.indexOf(":</b>",str))!=-1) {
str+=3;
name=lin.substring(str,end);
if(... and so on
}
}
}
(请注意此代码不在袖口,未经编译且未经测试,旨在传达基本理念)
答案 1 :(得分:0)
我能够使用正则表达式解决问题。
Pattern correct = Pattern.compile("\\<font color=.*?\\>", 0);
Pattern replace = Pattern.compile("\\</?(font|b|br/)( +.*?)?\\>", 0);
for (String s : Files.readAllLines(myfile)) {
if (correct.matcher(s).matches() && replace.matcher(s).matches()) {
String text = replace.matcher(s).replaceAll("");
String time = text.substring(1, text.indexOf(')'));
int offset = text.indexOf(':');
offset = text.indexOf(':', offset + 1);
int result = text.indexOf(':', offset + 1);
String name = text.substring(text.indexOf(')') + 2, result);
String message = text.substring(result + 2).trim();
// do stuff with time, name and message
}
}