簡體   English   中英

正則表達式提取Content-Type

[英]Regex to extract Content-Type

如何提取帶有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
Pattern regex = Pattern.compile("^Content-Type(?:.|\\s)*?(?=\n\\s+\n)");

這將匹配所有以Content-Type開頭的內容,直到第一個完全空行。

^Content-(.|\\n)*\\n\\n這將匹配直到空白行。

您可以嘗試此正則表達式

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

檢出相關的RFC,以了解標頭的確切定義。 從本質上講,IIRC您需要考慮將所有帶有換行符和一個或多個空格字符(例如,空格,不間斷空格,制表符)的內容都視為同一標題行的一部分。 我還認為您應該將換行符和空格折疊為一個空格元素(注意:可能存在更復雜的規則,因此請檢查RFC)。

僅當新行直接以非空格字符開頭時,它才是下一個標頭,並且如果它緊跟着另一個換行符,則它將結束標頭部分並開始正文部分。

順便說一句:為什么不使用JavaMail而不是重新發明輪子呢?

這個經過測試的腳本適用於我:

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樣式的行終止符的文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM