Regex для вилучення 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
2

5 Відповіді

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

Це буде відповідати всім, що починається з Content-Type до першого повністю порожнього рядка.

2
додано
Дякую! Але чому я отримую StackOverFlowError , коли я використовую це таким чином: mailContent.replaceFirst ("^ Content-Type (?:. | \\ s) *? (? = \ N \ \ S + \ "),
додано Автор Carven, джерело
Я навіть не знаю, яку частину коду я повинен вставити як зразок. Лол. Схоже, все працює добре, але поки я зміню регулярний вираз на той, який ви запропонували, я отримую StackOverFlowError. Отже, єдиною проблемою є рядок replaceAll . Це дивно, тому що у регулярному вираженні ви працювали, коли я ставлю його в тестувальника регулярного виразу. Але я не знаю, чому Java викидає цю помилку.
додано Автор Carven, джерело
@ridgerunner Вихід з нових рядків все ще має StackOverFlowError. Я зазвичай не рятуюсь від нових ліній, і вони працюють теж. Необхідно також уникнути нових ліній?
додано Автор Carven, джерело
@FailedDev Я поставив приклад коду на ideone.com/lLRg5 Якимось чином, StackOverFlowError викидається, коли Знайдіть() функцію.
додано Автор Carven, джерело
@FailedDev Я намагаюся з точністю зразка поштового вмісту вище в питанні. У меншому корпусі додаток зависає. Код, який я опублікував, не є повним, тому він не складається. Я не знаю, звідки я повинен почати публікувати свій код, оскільки це начебто довго, але головна частина полягає в тому, що я вже отримав emailContent в String, а потім спробую зробити replaceFirst() або 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 стирання рядків стилю Unix.

0
додано

Оформити відповідні RFC для точного визначення заголовків. IIRC по суті, ви повинні розглянути все з розривом рядка та одним або декількома символами пробілу (наприклад, пробіл, нерозривний простір, вкладка), щоб бути частиною тієї ж рядка заголовка. Я також вважаю, що вам слід згорнути стилі рядків та пробілів у єдиний елемент пробілу (примітка: можуть бути більш складні правила, тому перевірте RFC).

Лише якщо нова лінія безпосередньо починається з символу, що не є пробілом, це наступний заголовок, і якщо після нього одразу ж з'являється інша рядок рядка, вона закінчує розділ заголовка та починає розділ тіла.

BTW: чому не просто використовувати JavaMail, а не винаходити колесо?

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників