使用 QRegExp 解析 headers
Using QRegExp to parse headers
我正在使用 QRegExp 解析电子邮件 header 我的问题是如果 header 标签是多行的,我的正则表达式将无法工作。
这是我的正则表达式:(我 \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: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n
Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n
=?UTF-8?Q?ail?=\r\n
From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>\r\n
To: mail mail <mail@mail.com>\r\n
Content-Type: multipart/alternative; boundary=1a3xca651sv561fd321c5xv61sd12\r\n
它对 php、js... 如预期的那样工作,但对 QRegExp https://regex101.com/r/0J2jXT/2 无效。我无法获取标签主题的第二行。
编辑: 奇怪的是,如果我使用 c++11 中的 std::regex,我会得到正确的结果!
http://coliru.stacked-crooked.com/a/93494669f24422e1
QRegExp
是旧的 class,不应再使用(除非您被迫使用 Qt4...)。如果您可以使用 Qt 5 并希望获得更好的性能,请使用 QRegularExpression
。有了它,您的代码就可以工作了:
QString data = "Message-ID: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n"
"Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n"
"=?UTF-8?Q?ail?=\r\n"
"From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>\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: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n", "Message-ID", "<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>")
("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/?= <noreply@mail.com>\r\n", "From", "=?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>")
我正在使用 QRegExp 解析电子邮件 header 我的问题是如果 header 标签是多行的,我的正则表达式将无法工作。
这是我的正则表达式:(我 \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: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n
Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n
=?UTF-8?Q?ail?=\r\n
From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>\r\n
To: mail mail <mail@mail.com>\r\n
Content-Type: multipart/alternative; boundary=1a3xca651sv561fd321c5xv61sd12\r\n
它对 php、js... 如预期的那样工作,但对 QRegExp https://regex101.com/r/0J2jXT/2 无效。我无法获取标签主题的第二行。
编辑: 奇怪的是,如果我使用 c++11 中的 std::regex,我会得到正确的结果! http://coliru.stacked-crooked.com/a/93494669f24422e1
QRegExp
是旧的 class,不应再使用(除非您被迫使用 Qt4...)。如果您可以使用 Qt 5 并希望获得更好的性能,请使用 QRegularExpression
。有了它,您的代码就可以工作了:
QString data = "Message-ID: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n"
"Subject: =?UTF-8?Q?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?=\r\n"
"=?UTF-8?Q?ail?=\r\n"
"From: =?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>\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: <IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>\r\n", "Message-ID", "<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@mail.gmail.com>")
("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/?= <noreply@mail.com>\r\n", "From", "=?UTF-8?B?VGhlIGZ1Y2sgYXJlIHUgbG9va2luZyBmb3I/?= <noreply@mail.com>")