2016-08-01 37 views
0

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

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. –

+0

Was ist Ihre genaue Regex-Zeichenfolge? 'const char * str_regex =" ([A-Za-z] *) * (http?: //.*) * (HTTP/[0-9] [.] [0-9]) "scheint zu funktionieren Gut. –

+0

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'. –

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; 
}