Ich möchte Zeichenfolgen aus HTTP-Header wie: GET http://www.example.com HTTP/1.1
mit Regex extrahieren. Ich benutze dieses Muster: ^([A-Za-z]+)(\s+)(http?):\/\/(.*)(\s+)(HTTP\/)([0-9].[0-9])
und das funktioniert gut und spaltet GET
, http://www.example.com
und HTTP/1.1
. Aber wenn ich dieses Muster in C verwende, entgeht es nicht /
(d. H. \/\/
erkennt nicht in C). Wie kann ich das machen? Oder gibt es ein besseres Muster für das Extrahieren von Strings vom http-Header?Regex für HTTP-Header in C
0
A
Antwort
2
Beachten Sie, dass Sie einen Schrägstrich in einer C-Regex-Bibliothek nicht umgehen müssen, da regcomp
Regex-Begrenzer nicht unterstützt.
Alles, was Sie brauchen, ist richtig initialisiert das regmatch_t
, size_t
Variablen, verwenden Sie doppelte entkommt mit der \s
Stenografie Zeichenklasse, und übergeben Sie die REG_EXTENDED
Flags an den Regex Compiler.
Ich schlage vor, reduziert auch das Muster nur 3 Einfanggruppen: von
const char *str_regex = "([A-Za-z]+) +(http?://.*) +(HTTP/[0-9][.][0-9])";
Hinweis der Punkt ist „entkommen“ in eine Klammerausdruck setzen.
Voll C demoGET
Extrahieren, http://www.example.com
und HTTP/1.1
:
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
int main (void)
{
int match;
int err;
regex_t preg;
regmatch_t pmatch[4]; // We have 3 capturing groups + the whole match group
size_t nmatch = 4; // Same as above
const char *str_request = "GET http://www.example.com HTTP/1.1";
const char *str_regex = "([A-Za-z]+) +(http?://.*) +(HTTP/[0-9][.][0-9])";
err = regcomp(&preg, str_regex, REG_EXTENDED);
if (err == 0)
{
match = regexec(&preg, str_request, nmatch, pmatch, 0);
nmatch = preg.re_nsub;
regfree(&preg);
if (match == 0)
{
printf("\"%.*s\"\n", pmatch[1].rm_eo - pmatch[1].rm_so, &str_request[pmatch[1].rm_so]);
printf("\"%.*s\"\n", pmatch[2].rm_eo - pmatch[2].rm_so, &str_request[pmatch[2].rm_so]);
printf("\"%.*s\"\n", pmatch[3].rm_eo - pmatch[3].rm_so, &str_request[pmatch[3].rm_so]);
}
else if (match == REG_NOMATCH)
{
printf("unmatch\n");
}
}
return 0;
}
Sie wahrscheinlich nicht brauchen eine dieser Schrägstriche überhaupt. Bitte klären Sie Ihre Frage und fügen Sie ein kurzes Beispiel des * tatsächlichen Codes * hinzu, der das Problem veranschaulicht. Sie sollten auch angeben, welche Regex-Bibliothek Sie verwenden. Wir sind keine Gedankenleser, wissen Sie. –
Was ist Ihre genaue Regex-Zeichenfolge? 'const char * str_regex =" ([A-Za-z] *) * (http?: //.*) * (HTTP/[0-9] [.] [0-9]) "scheint zu funktionieren Gut. –
Wenn ich 'const char * str_regex ="^([A-Za-z] +) (\\ s +) (http?): \/\/(. *) (\\ s +) (HTTP \ /) ([0-9]. [0-9]) "', bekomme ich "GET", "", "http", "www.beispiel.com", "", "HTTP /", "1.1", " ET http://www.example.com HTTP/1.1 "erfasst. Das '\ /' kann durch '/' s ersetzt werden, aber am wichtigsten ist '\\ s'. –