Regex для извлечения Content-Type - PullRequest
       7

Regex для извлечения Content-Type

2 голосов
/ 28 октября 2011

Как извлечь строки с информацией о типе контента?В некоторых письмах эти заголовки могут быть в 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)*)*, но оно захватывает все.1008 *

Ответы [ 5 ]

2 голосов
/ 28 октября 2011
Pattern regex = Pattern.compile("^Content-Type(?:.|\\s)*?(?=\n\\s+\n)");

Это будет соответствовать всему, что начинается с Content-Type до первой полностью пустой строки.

1 голос
/ 28 октября 2011

Вы можете попробовать это регулярное выражение

Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);
1 голос
/ 28 октября 2011

^Content-(.|\n)*\n\n Это будет соответствовать до пустой строки.

0 голосов
/ 28 октября 2011

Этот проверенный скрипт работает для меня:

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.

0 голосов
/ 28 октября 2011

Проверьте соответствующие RFC для точного определения заголовков.В сущности, IIRC необходимо учитывать, что все, что имеет разрыв строки и один или несколько пробельных символов (например, пробел, неразрывный пробел, символ табуляции), должно быть частью одной строки заголовка.Я также считаю, что вы должны свернуть разрыв строки и пробелы в один элемент пробела (примечание: там могут быть более сложные правила, поэтому проверьте RFC).

Только если новая строка начинается непосредственно снепробельный символ - это следующий заголовок, и если сразу за ним следует другой разрыв строки, он заканчивает раздел заголовка и начинает раздел тела.

Кстати: почему бы просто не использовать JavaMail вместо изобретения колеса?1005 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...