Brauche Hilfe bei RegEx

  • Hallo zusammen,


    ich bin dabei einen Git pre-commit Hook zu basteln und brauche etwas Hilfe. Der Hook an sich wird gerufen und "funktioniert".

    Das Ding überprüft die Namen der Objekte, die commitet werden sollen, ob sie nur zulässige Zeichen beinhalten.


    Die zulässigen Zeichen sind:

    • A-Z
    • a-z
    • 0-9
    • - und _
    • diese Zeichen könnten drin sein, sind aber "optional" so zu sagen [, ], (, und )


    Mein Hook sieht bis jetzt so aus, ich überprüfe im Moment nur auf Leerzeichen (regex1 im Code):


    Die Variablen teststring1 und teststring2 sind Beispiele dafür, wie ein Objekten heißen kann.


    Wäre jemand so nett die RegEx zu schreiben, ich scheitere gnadenlos dran...


    Vielen Dank im Voraus!

  • Der Rest ist erfahrungsgemäß immer drin, nur diese optionale Zeichen könnten zusätzlich vorkommen.


    Siehe die beiden teststrings, teststring2 ist entspricht so ca 95% der Namen, teststring1 ist dann 5%.


    Man könnte auch so sagen: wenn NUR diese ausgelisteten Zeichen drin sind, dann ist alles super und es darf commitet werden.

  • Nach Austausch der ersten Zeile sollte das hier funktionieren, wenn C:/Program\ Files/Git/usr/bin/sh.exe POSIX-konform ist:

    Code
    #! /bin/bash
    
    filename="$1"
    
    fname="$(basename "$filename")"
    if [[ "$fname" =~ ^[\]\[\)\(0-9A-Za-z_\-]+$ ]]; then 
        echo "$fname match (valid)";
    else
        echo "$fname didn't match (invalid)!";
    fi

    Der Trick besteht in der korrekten Reihenfolge der Sonderzeichen ']' und '-', ansonsten kann man sich auf den Kopf stellen und nichts funktioniert (siehe hier).

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    Gefällt mir 1 Danke 1
  • Ich hab den Hook jetzt mal etwas umgebaut:

    Mein Verzeichnis mit Zeug sieht so aus:

    pasted-from-clipboard.png

    In den Verzeichnissen ist jeweils eine Datei drin.

    Es sollen beide Verzeichnisse und jeweiligen Dateien commitet werden:


    Ausgabe vom Hook:


    pasted-from-clipboard.png


    Irgendwas gefällt ihm noch nicht so...

  • Irgendwas gefällt ihm noch nicht so...

    In Zeile 48 wird ja zunächst immer die vollständige Pfadangabe verglichen (warum?), welche ein laut RegEx unzulässiges '/' enthält, deswegen sieht man hier genau zwei Fehlermeldungen aus diesem Block. Der zweite Block funktioniert ebenfalls nicht, weil in der ursprünglichen Liste der gültigen Zeichen kein '.' vorkam; somit wäre der RegEx zu erweitern auf ^[\]\[\)\(0-9A-Za-z_\.\-]+.

    Ich würde raten, die Scripts generell mit ShellCheck gegenzuprüfen, welches sich über Zeile 44 beschweren würde (wegen fehlenden Anführungszeichen). Wenn ein Verzeichnis oder eine Datei ein Leerzeichen enthält, bekommt basename hier automatisch zwei Argumente und das Ergebnis ist sicherlich nicht das gewünschte.

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    4 Mal editiert, zuletzt von m_ueberall ()

    Gefällt mir 1 Danke 1
  • Hallo,


    in den Zeilen 48 bis 52 wird der gesamte Pfad geprüft, dass hier ein Fehler auftritt ist völlig okay und erwartet. Die Verzeinisse gehören ja auch zum Commit und sollten auch überprüft werden. Das ist mir erst gerade klar geworden, sorry. Also der komplette Pfad (Verzeichnis und Dateiname) soll geprüft werden. Im Skript heißt die Variable filename.


    In den Zeilen 54 bis 58 findet die Prüfung der Filenamen statt, da sollte aber nicht zu Fehlern kommen.

  • Danke Dir für den Link zum ShellCheck, das kannte ich noch nicht.


    Also, die aktuelle Version:


    Habe die Prüfung der Dateien rangenommen und nur noch die Prüfung der Pfade drin gelassen.


    Ausgabe:


    pasted-from-clipboard.png

  • Also wie erwartet, weil im oberen, nunmehr einzigen Block im RegEx immer noch das '/' fehlt (der Ausdruck ^[\]\[\)\(0-9A-Za-z_/\.\-]+$, mit oder ohne Dollarzeichen am Ende, würde die übergebenen Pfade als valide akzeptieren).

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    Danke 1