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 - * :( | \ п) ^ *) * , але яна захоплівае ўсё.

Як я павінен фраза мой рэгулярны выраз у 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) * (= \ п \ \ s + \ & ZWNJ; п) »," ");
дададзена аўтар Carven, крыніца
Я нават не ведаю, якая частка кода я павінен ўставіць яго ў якасці ўзору. лол. Гэта як усё гэта працуе добра, але да таго часу, як я магу змяніць рэгулярны выраз у адным вы прапанавалі, я атрымліваю StackOverflowError. Такім чынам, адзіная праблема з'яўляецца replaceAll радка. Гэта дзіўна, таму што рэгулярны выраз вы мелі працы, калі я паклаў яго ў рэгулярны выраз тэстар. Але я не ведаю, чаму Java кідае гэтую памылку.
дададзена аўтар Carven, крыніца
@ridgerunner Экранаванне новых ліній па-ранейшаму мае StackOverflowError. Я звычайна не пазбегнуць новых ліній, і яны працавалі занадта. новыя лініі павінны быць экранаваныя занадта?
дададзена аўтар Carven, крыніца
@FailedDev я паклаў ўзор кода на ideone.com/lLRg5 Нейкім StackOverflowError выкідваецца, калі знайсці() выклікаецца функцыя.
дададзена аўтар Carven, крыніца
@FailedDev Я спрабую яго дакладнае ўтрыманне ўзору пошты вышэй ў пытанні. У меншай целе, прыкладанне завісае. Код, які я не завершаны, так што не кампілюецца. Я не ведаю, дзе я павінен пачаць размяшчэнне мой код з, таму што гэта свайго роду доўга, але асноўная частка, дзе я атрымаў emailContent ў радок ўжо, а затым паспрабаваць зрабіць replaceFirst() або знайсці() рэг.выразу вы прапанавалі. Я спрабаваў некаторыя іншыя выпадковыя рэгулярныя выразы і няма StackOverflowError. Гэта дзіўна.
дададзена аўтар Carven, крыніца
@xEnOn шчыра, я не ведаю. Вы можаце размясціць ўзор у ideone.com?
дададзена аўтар FailedDev, крыніца
@ridgerunner Так, я думаў, што таксама, але мой інструмент настойвае, што \ п ня быць ўдвая ўцяклі.
дададзена аўтар FailedDev, крыніца
@xEnOn Вы можаце паспрабаваць з падвойным уцёкамі ў \ п таксама?
дададзена аўтар FailedDev, крыніца
@xEnOn маглі б вы паспрабаваць з меншым целам лісты? Код размешчаны не кампілюецца: D
дададзена аўтар FailedDev, крыніца
Я думаю, што вам можа спатрэбіцца, каб пазбегнуць новага радка ў шаблоне, як так: "^ Content-Type? (: | ?. \\ s) * (? = \\ п \\ сек + \\ п)"
дададзена аўтар ridgerunner, крыніца

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

Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);
1
дададзена
@xEnOn Я не ведаю, чаму яна вяртаецца хлусня, тут ён паказвае матч regexr.com?2v20l
дададзена аўтар Narendra Yadala, крыніца
@xEnOn Я абнавіў рэгулярны выраз, вы можаце паспрабаваць яго зараз і дайце мне ведаць, калі ён працуе.
дададзена аўтар Narendra Yadala, крыніца
Я паспрабаваў гэта, але знайсці() вяртае хлусня. Ён не знаходзіць частку.
дададзена аўтар 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);
    }
}

Яна працуе для тэксту, якія маюць як сапраўдны: \ г \ п і (несапраўдныя, але звычайна выкарыстоўваюцца ў дзікай прыродзе): \ п Unix стыль радкі канчаткаў.

0
дададзена

Заказ адпаведны РЛК для дакладнага вызначэння загалоўкаў. IIRC у сутнасці, вы павінны разгледзець усе з LineBreak і адзін або некалькі прабельных сімвалаў (напрыклад, прастору, непарыўны прабел, табуляцыя), каб быць часткай адной і той жа радку загалоўка. Я таксама лічу, што вы павінны згарнуць і разрыў радкі прабельных сімвалаў (ы) у адным прабельных элементаў (звярніце ўвагу: там могуць быць больш складаныя правілы, так што праверыць РЛК).

Толькі калі новая лінія непасрэдна пачынаецца з непробельным сімвалам гэта наступны загаловак, і калі ён адразу ж рушылі ўслед іншы LineBreak ён заканчвае раздзел загалоўка і пачынаецца падзел цела.

ДАРЭЧЫ: Чаму б проста не выкарыстоўваць JavaMail замест таго каб вынаходзіць кола?

0
дададзена