C'è un modo per usare un'espressione regolare non greedy in C come si può usare in Perl? Ho provato diverse cose, ma in realtà non funziona.Espressione regolare Posix non-golosa
Attualmente sto usando questa espressione regolare che corrisponde a un indirizzo IP e la corrispondente richiesta HTTP, ma è avido, anche se sto usando il * ?:
([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1
In questo esempio, corrisponde sempre l'intera stringa:
#include <regex.h>
#include <stdio.h>
int main() {
int a, i;
regex_t re;
regmatch_t pm;
char *mpages = "TEST 127.0.0.1 GET /test.php HTTP/1.1\" 404 525 \"-\" \"Mozilla/5.0 (Windows NT HTTP/1.1 TEST";
a = regcomp(&re, "([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1", REG_EXTENDED);
if(a!=0)
printf(" -> Error: Invalid Regex");
a = regexec(&re, &mpages[0], 1, &pm, REG_EXTENDED);
if(a==0) {
for(i = pm.rm_so; i < pm.rm_eo; i++)
printf("%c", mpages[i]);
printf("\n");
}
return 0;
}
$ ./regtest
127.0.0.1 GET /test.php HTTP/1.1" 404 525 "-" "Mozilla/5.0 (Windows NT HTTP/1.1
Puoi aggiungere la stringa di input alla domanda. [Sembra funzionare per me.] (Http://regexr.com?37cvn) – OGHaza
Non so 'c' quindi non posso consigliare, ma il problema è nel tuo codice [non la tua regex] (http: //regexr.com?37cvt). Se aggiungi altro alla fine della stringa di input, probabilmente diventerà evidente che non corrisponde al secondo 'HTTP/1.1', ma piuttosto che restituisce l'intera stringa di input. – OGHaza
È possibile utilizzare una corrispondenza IP più accurata. Controlla questa risposta: http://stackoverflow.com/a/106223/363573 – Stephan