2

如何提取具有 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
4

5 回答 5

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

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

于 2011-10-28T02:33:57.870 回答
1

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

于 2011-10-28T03:22:51.753 回答
1

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

Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);
于 2011-10-28T03:26:37.740 回答
0

查看相关 RFC 以了解标头的确切定义。IIRC 本质上,您需要考虑所有带有换行符和一个或多个空白字符(例如空格、不间断空格、制表符)的所有内容都属于同一标题行。我还认为您应该将换行符和空格折叠成单个空格元素(注意:可能有更复杂的规则,因此请查看 RFC)。

仅当新行直接以非空白字符开头时,它才是下一个标题,如果它紧跟另一个换行符,则结束标题部分并开始正文部分。

顺便说一句:为什么不直接使用 JavaMail 而不是重新发明轮子?

于 2011-10-28T07:59:06.457 回答
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和(无效但通常在野外使用)的文本:\nUnix 样式的行终止符。

于 2011-10-28T15:44:53.193 回答