正则表达式提取内容类型

时间:2011-10-28 02:19:55

标签: java regex email email-headers

如何使用Content-Type信息提取行?在某些邮件中,这些标题可以是2或3行甚至4行,具体取决于它的发送方式。这是一个例子:

Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit

Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit 
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint 
occaecat cupidatat non proident, sunt in culpa qui officia 
deserunt mollit anim id est laborum.

我试过这个正则表达式:^(Content-.*:(.|\n)*)*但它抓住了一切。

我应该如何在Java中使用我的正则表达式来获取部分内容:

Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit

5 个答案:

答案 0 :(得分:2)

Pattern regex = Pattern.compile("^Content-Type(?:.|\\s)*?(?=\n\\s+\n)");

这将匹配以Content-Type开头的所有内容,直到第一个完全空行。

答案 1 :(得分:1)

^Content-(.|\n)*\n\n 这将匹配到空白行。

答案 2 :(得分:1)

你可以试试这个正则表达式

Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);

答案 3 :(得分:0)

查看相关RFC以了解标头的确切定义。 IIRC本质上你需要考虑所有带有换行符和一个或多个空白字符(例如空格,不间断空格,制表符)的内容,使其成为同一标题行的一部分。我也相信你应该把linebreak和whitespace折叠成一个空格元素(注意:可能有更复杂的规则,所以检查RFC)。

只有当新行直接以非空格字符开头时,它才是下一个标题,如果紧接着是另一个换行符,它将结束标题部分并启动正文部分。

BTW:为什么不使用JavaMail而不是重新发明轮子?

答案 4 :(得分:0)

这个经过测试的脚本适合我:

import java.util.regex.*;
public class TEST
{
    public static void main( String[] args )
    {
        String subjectString =
            "Content-Type: text/plain;\r\n" +
            "    charset=\"us-ascii\"\r\n" +
            "Content-Transfer-Encoding: 7bit\r\n" +
            "\r\n" +
            "Lorem ipsum dolor sit amet, consectetur adipisicing elit,\r\n" +
            "sed do eiusmod tempor incididunt ut labore et dolore magna\r\n" +
            "aliqua. Ut enim ad minim veniam, quis nostrud exercitation\r\n" +
            "ullamco laboris nisi ut aliquip ex ea commodo consequat.\r\n" +
            "Duis aute irure dolor in reprehenderit in voluptate velit\r\n" +
            "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\r\n" +
            "occaecat cupidatat non proident, sunt in culpa qui officia\r\n" +
            "deserunt mollit anim id est laborum.\r\n";
        String resultString = null;
        Pattern regexPattern = Pattern.compile(
            "^Content-Type.*?(?=\\r?\\n\\s*\\n)",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE |
            Pattern.UNICODE_CASE | Pattern.MULTILINE);
        Matcher regexMatcher = regexPattern.matcher(subjectString);
        if (regexMatcher.find()) {
            resultString = regexMatcher.group();
        } 
        System.out.println(resultString);
    }
}

适用于同时具有有效的\r\n和(无效但在野外常用)的文本:\n Unix样式行终止。