regcomp repeated word



  • Hallo zusammen,

    ich bin ein wenig am verzweifeln. Ich möchte in einem String ein Repeated Word matchen. In der PHP regex Funktion klappt es wunderbar, aber bei der C++ Funktion nicht.

    REGEX: (\w+)[._-]\1

    Nach der Ursachenforschung wird das \1 nicht erkannt (remembered Word). Gibt es dazu eine Lösung bzw. ein Vorschlag?

    Danke



  • Vielleicht keine PHP spezifische Scheiße verwenden?
    Was soll das tun?



  • Ah, ich sehe schon, was du meinst. Ich glaube in C++ funktioniert das mit dem $n.



  • Vielen Dank für deine Antwort!

    Ein Beispiel: Hallo.World.World.Hello

    Dann sollte World.World gematcht werden.



  • Beispielweise

    #include <iostream>
    #include <string>
    
    #include <sys/types.h>
    #include <regex.h>
    
    int main() {
      regex_t rex;
      regmatch_t match;
    
      regcomp(&rex, "\\([a-z]\\+\\)\\(\\.\\1\\)\\+", REG_ICASE);
    
      char const *text = "Hello.World.World.Hello";
    
      regexec(&rex, text, 1, &match, 0);
    
      std::string m(text + match.rm_so,
                    text + match.rm_eo);
      std::cout << m << std::endl;
    
      regfree(&rex);
    }
    

    Allerdings versuchst du da, eine nicht-reguläre kontextfreie Sprache mit regulären Ausdrücken zu verarbeiten. POSIX hat einige Mechanismen, die das bis zu einem gewissen Grad ermöglichen (konkret back references), aber es ist ziemlich umständlich, man kann sich dabei leicht vertun, und ab einer gewissen Größe werden die Ausdrücke völlig unlesbar. Womöglich wärst du mit einem Parser-Generator oder einem entsprechenden Framework (wie Boost.Spirit) besser dran.


Anmelden zum Antworten