コンテンツタイプを抽出する正規表現

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
2

5 答え

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

これは、最初の完全に空の行までContent-Typeで始まるすべてのものと一致します。

2
追加された
ありがとう!しかし、なぜ私はこのように使用すると StackOverFlowError を得るのですか? mailContent.replaceFirst( "^ Content-Type(?:。| \\ s)*?(?= \ n \ \ s + \‌ n) "、" ");
追加された 著者 Carven,
私はコードのどの部分をサンプルとして貼り付けるべきか分からない。笑。それはすべて正常に動作するようなものですが、あなたが提案したものに正規表現を変更する限り、私はStackOverFlowErrorを取得します。唯一の問題は replaceAll です。それは私が正規表現のテスターに​​それを入れたときにあなたが正規表現を持っていたので奇妙です。しかし、私はなぜJavaがそのエラーを投げるのか分かりません。
追加された 著者 Carven,
@ridgerunner新しい行をエスケープするにはまだStackOverFlowErrorがあります。私は通常、新しい行を逃れることはありませんし、彼らも働いた。新しい行もエスケープする必要がありますか?
追加された 著者 Carven,
@FailedDev私は ideone.com/lLRg5 にサンプルコードを書いています。どうやらStackOverFlowErrorは find()関数が呼び出されます。
追加された 著者 Carven,
@FailedDev私は質問の上に正確なサンプルメールの内容でそれを試しています。小さいボディでは、アプリケーションがハングします。投稿したコードは完全ではないので、コンパイルされません。私はコードの投稿をどこから始めるべきかわかりませんが、長いことですが、主要な部分は emailContent をStringにしてから、 replaceFirstあなたが提案した正規表現を使って find()または find()私はいくつかの他のランダムな正規表現を試して、StackOverFlowErrorはありません。それは奇妙だ。
追加された 著者 Carven,
@xEnOn私は正直に分かりません。あなたはideone.comでサンプルを投稿できますか?
追加された 著者 FailedDev,
@ridgerunnerうん、私はそれも考えていたが、私のツールは\ nが二重にエスケープされていないと主張する。
追加された 著者 FailedDev,
@xEnOnあなたは\ nでもダブルエスケープで試すことができますか?
追加された 著者 FailedDev,
@xEnOn小さなメール本文で試してみませんか?投稿したコードはコンパイルされません:D
追加された 著者 FailedDev,
"^ Content-Type(?:。| \\ s)*?(?= \\ n \\ s + \\ n)"のように改行をエスケープする必要があるかもしれないと思います。コード>
追加された 著者 ridgerunner,

この正規表現を試すことができます

Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);
1
追加された
@xEnOnなぜ偽を返しているのか分かりません。ここでは一致を示しています。 regexr.com?2v20l
追加された 著者 Narendra Yadala,
@xEnOn正規表現を更新しました。今すぐ試してみて、動作すれば教えてください。
追加された 著者 Narendra Yadala,
私はこれを試しましたが、 find()はfalseを返します。それはその部分を見つけません。
追加された 著者 Carven,

^Content-(.|\n)*\n\n This will match until the blank line.

1
追加された

このテストされたスクリプトは私のために働く:

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

0
追加された

ヘッダーの正確な定義については、関連するRFCを参照してください。 IIRCは本質的に改行と1つまたは複数の空白文字(スペース、改行禁止スペース、タブなど)をすべて同じヘッダ行の一部として考慮する必要があります。改行と空白を1つの空白要素に畳まなければならないと考えています(もっと複雑な規則があるかもしれないので、RFCをチェックしてください)。

新しい行が空白以外の文字で直接開始される場合のみ、次のヘッダーになります。直後に改行が続くと、ヘッダーセクションが終了し、本文セクションが開始されます。

ところで、車輪を改造するのではなく、JavaMailを使うだけではどうですか?

0
追加された