在Java中剥离HTML

时间:2014-05-09 01:57:55

标签: java html regex

我有几百个具有完全相同格式的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库看起来有点复杂,我正在尝试做什么。有什么建议吗?

2 个答案:

答案 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
    }
}