Regex Menge reduzieren



  • Hallo zusammen

    ich möchte einen String auf Zeichen prüfen und dafür die Gruppe "[:graph:]" nutzen, aber ohne Gänsefüßchen.

    Wie krieg ich sowas hin? Ich hatte was versucht wie
    ([:graph:]&[^"])
    aber das kommt von der Syntax her nicht hin.

    Das gleiche wäre z.B. [0-9a-z] aber ohne die 3 und ohne das b.
    Ich will quasi eine Menge um eines oder mehr Zeichen reduzieren.
    Wie würde ich sowas machen?



  • Man kann sowas mit einem look-ahead oder look-behind lösen.

    In Perl ginge das so:

    use 5.16.0;
    my $test = "blub3blux5";
    $test =~ /blu(.)(?!3)[0-9a-z]/ && say $1; #hier kommt x raus (keine 3 darf folgen)
    $test =~ /blu(.)(?!5)[0-9a-z]/ && say $1; #hier kommt b raus (keine 5 darf folgen)
    

    Ich hatte immer Probleme mit den REs in C++11, die haben für mich immer nicht funktioniert und ich bin dann auf boost::regex umgestiegen. Musst du mal schauen, ob das mit dem negativen look-ahead (?!hier-das-was-nicht-folgen-darf) funktioniert.



  • Ich glaube gelesen zu haben dass std::regex look-behind z.b. gar nicht unterstützt.

    Ich befürchte fast ich muss die Menge selbst zusammensetzen, was schade ist.



  • Scheint aber inzwischen zu funktionieren, habs gerade mal getestet (mein Beispiel war ein negativer look-ahead, kein look-behind):

    std::smatch sm;
    std::regex reDigitNo5("(?!5)[0-9]");
    string str = "1"; std::regex_match(str,sm,reDigitNo5)
    (bool) true
    str = "2"; std::regex_match(str,sm,reDigitNo5)
    (bool) true
    str = "5"; std::regex_match(str,sm,reDigitNo5)
    (bool) false
    


  • Das ist die Lösung! Danke dir! 🙂


Log in to reply