Использование QRegExp для разбора заголовков

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

Вот мое регулярное выражение: (на данный момент у меня есть заполнители \r\n )

QRegExp regex("([\\w-]+): (.+)\\r\\n(?:([^:]+)\\r\\n)?")
regex.setMinimal(true)
// PCRE: ([\w-]+): (.+?)\\r\\n(?:([^:]+?)\\r\\n)?

И что я пытаюсь разобрать:

MIME-Version: 1.0\r\n
x-no-auto-attachment: 1\r\n
Received: by 10.200.36.132; Sun, 5 Feb 2017 01:21:33 -0800 (PST)\r\n
Date: Sun, 5 Feb 2017 01:21:33 -0800\r\n
Message-ID: <[email protected]>\r\n
Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n
=?UTF-8?Q?ail?=\r\n
From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <[email protected]>\r\n
To: mail mail <[email protected]>\r\n
Content-Type: multipart/alternative; boundary=1a3xca651sv561fd321c5xv61sd12\r\n

Он работает, как и ожидалось, для php, js... но не с QRegExp https://regex101.com/r/0J2jXT/2. Я не могу получить вторую строку тега Subject.

EDIT: Что странно, если я использую std::regex из c++11, я получаю правильный результат! http://coliru.stacked-crooked.com/a/93494669f24422e1


person 2A-66-42    schedule 01.05.2017    source источник
comment
. (точка) Соответствует любому символу (включая новую строку).   -  person arturx64    schedule 01.05.2017
comment
Или вы можете добавить модификатор к вашему регулярному выражению (?-m).   -  person arturx64    schedule 01.05.2017
comment
@arturx64 ли . соответствует новой строке, обычно зависит от флагов (не уверен насчет qregexp). если у вас многострочный набор или нет.   -  person xaxxon    schedule 01.05.2017
comment
Я также пробовал это, которое должно соответствовать новой строке "([\\w-]+): (.+)\\r\\n(?:([^:]+)\\r\\n)?"   -  person 2A-66-42    schedule 01.05.2017
comment
@WiktorStribiżew вы не можете использовать нежадный квантификатор в регулярном выражении, поэтому я сделал: regex.setMinimal(true) и я точно знаю, что конец строки \r\n   -  person 2A-66-42    schedule 01.05.2017
comment
к вашему сведению, вы должны использовать QRegularExpression   -  person deW1    schedule 01.05.2017


Ответы (1)


QRegExp - это старый класс, и его больше не следует использовать (за исключением того, что вы вынуждены работать с Qt4...). Если вы можете использовать Qt 5 и хотите повысить производительность, используйте QRegularExpression. С ним ваш код работает:

QString data = "Message-ID: <[email protected]>\r\n"
               "Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n"
               "=?UTF-8?Q?ail?=\r\n"
               "From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <[email protected]>\r\n";

QRegularExpression rx("([\\w-]+): (.+)\\r\\n(?:([^:]+)\\r\\n)?");
QRegularExpressionMatchIterator it = rx.globalMatch(data);
while(it.hasNext()) {
    QRegularExpressionMatch match = it.next();
    qDebug() << match.capturedTexts();
}

выходы:

("Message-ID: <[email protected]>\r\n", "Message-ID", "<[email protected]>")
("Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n=?UTF-8?Q?ail?=\r\n", "Subject", "=?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=", "=?UTF-8?Q?ail?=")
("From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <[email protected]>\r\n", "From", "=?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <[email protected]>")
person Lorenz    schedule 01.05.2017