regex suchen und gefundene Zeilen ausgeben



  • Hey Community 😉

    Habe ein Problem mit meinem Programm. Ich versuche mithilfe von regex aus einem String verschiedene Teilstrings zu finden. Die Vorgegebenen Muster habe ich in einer Liste abgespeichert.

    Also Ausgabe sollte zum Beispiel erscheinen:
    String:" case "
    Ausgabe:"Zeile 4-8 gesuchtes_wort"

    Mein Muster dazu lautet "^(case)\s|\s(case)\s"
    Aber statt dessen sagt mir die Console zeile 3-9. Ich weis das es was mit den Space in meinem Suchmuster zu tun hat aber warum gibt er mir nicht die Zeilen des gesuchten wortes bzw des im Klammer stehendenan sonder zählt die leerzeichen dazu?

    Ich hab das Gefühl das ich die regex funktionen nicht richtig nutze. Hab mir schon viele Dokumentationen etc dazu angeschaut aber weiter komme ich leider nicht.

    Und gibt es eine bessere möglichkeit die Muster zu definieren wie ich es gemacht habe?

    Hier der code:

    #include <string.h>
    #include <stdio.h>
    #include <regex.h>
    #include <sys/types.h>
    
    #define text 200
    
    void show(char *string, int start, int end){
        int k,l;
        printf("%d-%d: ",start, end);
        for (k = start; k < end; ++k) putchar(string[k]);
        putchar('\n');
    }
    
    void parts(char *string){
        int error, n, i, absolute;
        regex_t reg;
        regmatch_t pm[l];
    
        n = 0;
        absolute = 0;
    
        struct s_woerter{
            char muster[text];
            char wort[text];
        }lib[30];
    
        strcpy(lib[n].wort,"/*");
        strcpy(lib[n].muster,"(\\/\\*)");
    
        strcpy(lib[n++].wort,"//");
        strcpy(lib[n].muster,"(\\/\\/)");
    
        strcpy(lib[n++].wort,"switch");
        strcpy(lib[n].muster,"(^switch)\\(|(^switch)\\s+|\\s+(switch)\\(|\\s+(switch)\\s+");
    
        strcpy(lib[n++].wort,"case");
        strcpy(lib[n].muster,"^(case)\\s|\\s(case)\\s");
    
        strcpy(lib[n++].wort,"break");
        strcpy(lib[n].muster,"(^break)\\s*;|\\s+(break)\\s*;");
    
        strcpy(lib[n++].wort,"continue");
        strcpy(lib[n].muster,"(^continue)\\s*;|\\s+(continue)\\s*;");
    
        strcpy(lib[n++].wort,"return");
        strcpy(lib[n].muster,"(^return)\\s*;|(^return)\\s+|\\s+(return)\\s*;|\\s(return)\\s+");
    
        strcpy(lib[n++].wort,"struct");
        strcpy(lib[n].muster,"(^struct)\\s+|\\s+(struct)\\s+");
    
        strcpy(lib[n++].wort,"int");
        strcpy(lib[n].muster,"(^int)\\s+|\\s+(int)\\s+");
    
        strcpy(lib[n++].wort,"__int64");
        strcpy(lib[n].muster,"(^__64int)\\s+|\\s+(__64int)\\s+");
    
        strcpy(lib[n++].wort,"char");
        strcpy(lib[n].muster,"(^char)\\s+|\\s+(char)\\s+");
    
        strcpy(lib[n++].wort,"unsigned");
        strcpy(lib[n].muster,"(^unsigned)\\s+|\\s+(unsigned)\\s+");
    
        strcpy(lib[n++].wort,"long");
        strcpy(lib[n].muster,"(^long)\\s+|\\s+(long)\\s+");
    
        strcpy(lib[n++].wort,"longlong");
        strcpy(lib[n].muster,"(^longlong)\\s+|\\s+(longlong)\\s+");
    
        strcpy(lib[n++].wort,"if");
        strcpy(lib[n].muster,"(^if)\\s*\\(|(^if)\\s+|\\s+(if)\\s+|\\s+(if)\\(");
    
        strcpy(lib[n++].wort,"else");
        strcpy(lib[n].muster,"(^else)\\s*\\{|(^else)\\s+|\\s+(else)\\s+|\\s+(else)\\{");
    
        strcpy(lib[n++].wort,"for");
        strcpy(lib[n].muster,"(^for)\\s*\\(|(^for)\\s+|\\s+(for)\\s+|\\s+(for)\\(");
    
        strcpy(lib[n++].wort,"do");
        strcpy(lib[n].muster,"(^do)\\s*\\{|(^do)\\s+|\\s+(do)\\s+|\\s+(do)\\{");
    
        strcpy(lib[n++].wort,"while");
        strcpy(lib[n].muster,"(^while)\\s*\\(|(^while)\\s+|\\s+(while)\\s+|\\s+(while)\\(");
    
        strcpy(lib[n++].wort,"void");
        strcpy(lib[n].muster,"(^void)\\s+|(^void)[\\(\[\\{]|\\s+(void)[\\(\[\\{]|\\s+(void)\\s+");
    
        strcpy(lib[n++].wort,"#include");
        strcpy(lib[n].muster,"(^#include)\\s+|\\s+(#include)\\s+");
    
        for(i = 0; i < n+1; i++){
            absolute = 0;
            if(regcomp(&reg, lib[i].muster, REG_EXTENDED) != 0) return;
            error = regexec(&reg, string, 1, &pm, 0);
            while (error == 0){
                show(string, absolute+pm.rm_so, absolute+pm.rm_eo);
                absolute += pm.rm_eo;
                error = regexec(&reg, absolute+string, 1, &pm, 0);
            }
            regfree(&reg);
    
        }
    }
    
    main(int argc,char *argv){
        char string[text];
    
        printf("Geben sie ein String ein\n");
        gets(string);
    
        parts(string);
    
    }
    

Anmelden zum Antworten