2016-09-08 8 views
1

Dies ist mein erstes Mal mit Regex in C arbeiten und ich habe einige Probleme. Ich versuche, eine Syntax zu replizieren, die in sed verwendet wird, nämlich die s/findthisstring/replacewiththis/g, wo findthisstring vorhanden sein muss und replacewiththis nicht.Posix regulärer Ausdruck funktioniert nicht in C

Die Regex kam ich mit ist ^s/(.*)/(.*)/g$

Hier ist es in meinem Code ist

int verifyPattern(char *pattern) { 
    regex_t regex; 
    int reti = regcomp(&regex, "^s/(.*)/(.*)/g$", 0); 

    if (reti) { 
     fprintf(stderr, "Could not compile regex\n"); 
     exit(1); 
    } 

    reti = regexec(&regex, pattern, 0, NULL, 0); 
    if (!reti) { 
     puts("Match"); 
    } else if (reti == REG_NOMATCH) { 
     puts("No match"); 
    } else { 
     puts("Regex error"); 
    } 

    return 1; 
} 

Ich glaube, der Teil, der oben ist Unordnung der .+ ist. Wenn ich es durch .* ersetze, ist alles in Ordnung. Weiß jemand eine Arbeit dafür?

Danke!

+0

Bitte geben Sie einen Testfall zu zeigen, was nicht funktioniert. –

+0

Warum entkommst du dem Forward-Schrägstrich in der Regex. Das '/' ist kein Metazeichen in einer Regex-Engine. Außerdem ist es nicht so einfach, eingebettete reguläre Ausdrücke zu finden, wenn Sie nicht wissen, wie Sie reguläre Ausdrücke analysieren. – sln

+0

Probieren Sie 'const char * str_regex ="^s/((\\\\. | [^ \\\\ /] +) +)/(. *)/G $ ";' –

Antwort

1

Sie haben vergessen, das REG_EXTENDED Flag zu übergeben, um $ im Muster zuzulassen. Außerdem würde Ihr Regex zu viele /.../ Abschnitte zulassen. Was Sie brauchen, ist entweder eine Escape-Sequenz oder ein Zeichen anders als / und \ zum Spiel:

int reti = regcomp(&regex, "^s/(\\\\.|[^\\\\/]+)+/(\\\\.|[^\\\\/]+)*/g$", REG_EXTENDED); 

Siehe C demo

Grundsätzlich ersetzt ich . mit (\\.|[^\\/]+) Muster entweder eine Escape-Sequenz (\\.) passend oder (|) ein oder mehrere Zeichen außer \ und /. Hier

ist eine Liste der Tests:

verifyPattern("s/s/s/g");//Match 
verifyPattern("s/s//g");//Match 
verifyPattern("s//s/g");//No Match 
verifyPattern("s/s\\/s/g");//No match 
verifyPattern("s/s\\/s/text/text/text/g"); // No match