regex и терминальный ноль

269
23 июля 2017, 11:20

здравствуйте, необходимо выдрать из запроса scgi все заголовки и их значения через регулярки... запрос:

CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0/deepthought\0,What is the answer to life?

вся проблема в терминальном нуле... уж что только не пробовал: "(\0[a-zA-Z_/]+\0)", вообще даже просто числа не находит "(\\d+)"

сам код:

auto f = QString("CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0/deepthought\0,What is the answer to life?");
QRegExp rx("(/\x00/\\d+)");    // сюда много чего перепробовал
int pos1{0}; QStringList list1;
while ((pos1 = rx.indexIn(f, pos1)) != -1) {
    list1 << rx.cap(1);
    pos1 += rx.matchedLength();
}
std::cout << list1.join(",").toStdString() << std::endl;

товарищ Abyx, натолкнул на мысль, однако так и не знаю как вытащить значения заголовков(например 27), после этого:

f = QString::fromLocal8Bit("CONTENT_LENGTH\027\0SCGI\01\0REQUEST_METHOD\0POST\0REQUEST_URI\0/deepthought\0,What is the answer to life?"
          , 96);
QRegExp rx("(\\x00*[a-zA-Z_/]+)");

выводится следующее:

  CONTENT_LENGTH,SCGI,REQUEST_METHOD,POST,REQUEST_URI,/deepthought,What,is,the,answer,to,life
Answer 1

С Вашим примером есть несколько проблем, а метод, которым Вы решили задачу решать, ей совершенно не подходит — регулярные выражения здесь вообще ни к чему (как и в большинстве случаев).

Итак, первое, Вам нужно знать длину строки "CONTENT_LENGTH\027\0SCGI...", которую вычислить не получится из-за наличия нуль символов в оной. Я предполагаю, что строка эта откуда-то берётся и оттуда можно получить её длину.

Дальше, в примере, который Вами представлен, Вы пытаетесь сконструировать строку из нуль-символов и чисел, а в результате получается ерунда. Если Вы думаете, что "\027", это строка состоящая из нуль-символа и числа 27, то Вы заблуждаетесь,— это число 027 в восьмеричной системе счисления. Честно говоря, я не знаю, как это записать одной строкой, но обходной путь покажу в примере ниже.

Мой пример составлен на основе Вашего, но сокращён, чтобы упростить вычисление длины строки и прочее.

auto request = QByteArray("CONTENT_LENGTH\0""27\0""SCGI\0""1", 25);
auto list = request.split('\0');
// Удалим пустой элемент, появившийся из-за закрывающего нуль-символа в C-строке
list.removeLast();
for(size_t i = 0; i < list.size(); i += 2)
    qDebug() << list[i] << " = " << list[i + 1];

И всё, никаких регулярных выражений. Вам остаётся только адаптировать Ваш реальный код, под идею, что я привёл выше.

READ ALSO
В чем же проблема [требует правки]

В чем же проблема [требует правки]

Пишу программуУсловие: вывести те слова из строки у которых гласные и согласные чередуются

268
Наследование и создание объекта

Наследование и создание объекта

Здравствуйте! Такая ситуацияПрограмма для подсчета зарплат сотрудникам

245
Почему не работает PostMessage C++

Почему не работает PostMessage C++

Почему не работает этот код на C++ ?

352
Правильная таблица умножения

Правильная таблица умножения

Как сделать так, чтобы переменная number в цикле оставляла свое значение, которое будет введено с клавиатуры?

442