Ich habe mich damit schon öfters beschäftigt. Die grundsätzliche Funktionsweise macht schon Sinn, aber die Syntax wirklich zu verstehen und es sich dann auch noch zu merken finde ich sehr schwierig - jedes Mal, wenn ich es brauche, krebse ich wieder rum. Entsprechend benutze ich wenn möglich was anderes, Regex ist ja nicht die einzige Syntax zum Pattern Matching.
In der stdlib von Haskell gibt es im Vergleich zu den meisten anderen keine Regex Implementation, in der Sprache ist es üblich stattdessen mit Parser Combinators zu arbeiten.
Naja, Regex ist ja erstmal nur die Syntax zur Beschreibung eines Textes. Das muss ja dann ein Parser noch interpretieren und damit etwas machen.
Bei so einem Parser Combinator purzelt ja direkt ein Parser-Programm heraus, wenn ich das richtig verstehe. Also ja, da gibt es auch eine gewisse Syntax, die auch die Struktur des zu parsenden Textes irgendwo widerspiegelt, aber es ist nicht nur eine Beschreibung des Textes, sondern formuliert direkt die Parser-Logik.
Also ja, wenn man sowieso ein Programm schreibt, macht es wahrscheinlich keinen großen Unterschied. Aber gibt es ja schon auch oft, dass man ein bestehendes Programm hat und da nur noch ein Regex mitgeben kann, um das Verhalten zu konfigurieren…
Naja, Regex ist ja erstmal nur die Syntax zur Beschreibung eines Textes. Das muss ja dann ein Parser noch interpretieren und damit etwas machen.
Ich verstehe was du meinst. Falls die Implementation die Regex direkt zu einem Parser kompiliert und in einer VM ausführt, ist sie quasi selber der Parser bzw der Quellcode dafür. Aber ich verstehe deine Sicht, ich sage nicht dass du falsch liegst.
Bei so einem Parser Combinator purzelt ja direkt ein Parser-Programm heraus, wenn ich das richtig verstehe.
Nein, das wäre der Fall bei yacc & co, wo man eine Grammatik schreibt und ein Parser generiert wird. nom ist vielmehr eine Bibliothek, mit welcher man von Hand eigene Parser implementiert. Sie besteht aus ganz einfachen, ganz generalisierten Komponenten, die man kombiniert - deswegen der Name Parser Combinator Library.
aber es ist nicht nur eine Beschreibung des Textes, sondern formuliert direkt die Parser-Logik.
Es gibt viele direkte Equivalenzen. Es gibt Kombinatoren für “eine oder mehrere Leerschläge” und “exakt ein Kleinbuchstabe” und “optional eine Ziffer” und so weiter - das ist genau dasselbe, was man in Regex auch ausdrückt. Ich würde sagen, nom ist ein Superset von Regex.
Also wenn man konkret auf Dateipfade matchen will, dann sind Glob-Patterns das Mittel der Wahl. Sieht dann so aus: /home/fr*/Downloads/
Der Stern ist dann eben ein Wildcard, so dass du damit z.B. die Downloads-Verzeichnisse der Benutzer franz und fridolin löschen könntest.
Sonst kenne ich persönlich eigentlich nur immer so Einzelphänomene, also wo’s dann für eine Programmiersprache eine Bibliothek gibt, womit man dann ein Pattern z.B. mittels einer Builder-API zusammensetzen kann.
Die können dann oft auch zu einem Regex übersetzt werden, so dass man sie in bestehende APIs reinwerfen kann, die eben ein Regex erwarten.
Keine Ahnung, persönlich finde ich nicht, dass man sich dadurch das Erlernen von Regex sparen kann…
Nicht zu vergessen, die drölfzig verschiedenen Dialekte, und der Fakt dass das Werkzeug das Du gerade nutzen willst leider genau diese eine Funktion nicht unterstützt oder hinter einem neuen obskuren Sonderzeichen versteckt, dass es nicht auf Deiner Tastatur gibt.
Ich habe mich damit schon öfters beschäftigt. Die grundsätzliche Funktionsweise macht schon Sinn, aber die Syntax wirklich zu verstehen und es sich dann auch noch zu merken finde ich sehr schwierig - jedes Mal, wenn ich es brauche, krebse ich wieder rum. Entsprechend benutze ich wenn möglich was anderes, Regex ist ja nicht die einzige Syntax zum Pattern Matching.
Jetzt muss ich mal meine mangelnde Bildung offenbaren: welche Alternativen gäbe es da?
Parser Combinators, beispielsweise: https://docs.rs/nom/latest/nom/
In der stdlib von Haskell gibt es im Vergleich zu den meisten anderen keine Regex Implementation, in der Sprache ist es üblich stattdessen mit Parser Combinators zu arbeiten.
Puh, hatte nicht erwartet, dass du das mit “Syntax zum Pattern Matching” meinst. Das ist ja schon ein vollwertiger Parser. 😅
So halb. Man kann damit Parser bauen. Andererseits - was ist eine Regex wenn nicht ein kleiner Parser?
Naja, Regex ist ja erstmal nur die Syntax zur Beschreibung eines Textes. Das muss ja dann ein Parser noch interpretieren und damit etwas machen.
Bei so einem Parser Combinator purzelt ja direkt ein Parser-Programm heraus, wenn ich das richtig verstehe. Also ja, da gibt es auch eine gewisse Syntax, die auch die Struktur des zu parsenden Textes irgendwo widerspiegelt, aber es ist nicht nur eine Beschreibung des Textes, sondern formuliert direkt die Parser-Logik.
Also ja, wenn man sowieso ein Programm schreibt, macht es wahrscheinlich keinen großen Unterschied. Aber gibt es ja schon auch oft, dass man ein bestehendes Programm hat und da nur noch ein Regex mitgeben kann, um das Verhalten zu konfigurieren…
Ich verstehe was du meinst. Falls die Implementation die Regex direkt zu einem Parser kompiliert und in einer VM ausführt, ist sie quasi selber der Parser bzw der Quellcode dafür. Aber ich verstehe deine Sicht, ich sage nicht dass du falsch liegst.
Nein, das wäre der Fall bei yacc & co, wo man eine Grammatik schreibt und ein Parser generiert wird. nom ist vielmehr eine Bibliothek, mit welcher man von Hand eigene Parser implementiert. Sie besteht aus ganz einfachen, ganz generalisierten Komponenten, die man kombiniert - deswegen der Name Parser Combinator Library.
Es gibt viele direkte Equivalenzen. Es gibt Kombinatoren für “eine oder mehrere Leerschläge” und “exakt ein Kleinbuchstabe” und “optional eine Ziffer” und so weiter - das ist genau dasselbe, was man in Regex auch ausdrückt. Ich würde sagen, nom ist ein Superset von Regex.
Pearl Regex ;)
Du machst mich weinend 😭
Also wenn man konkret auf Dateipfade matchen will, dann sind Glob-Patterns das Mittel der Wahl. Sieht dann so aus:
/home/fr*/Downloads/Der Stern ist dann eben ein Wildcard, so dass du damit z.B. die
Downloads-Verzeichnisse der Benutzerfranzundfridolinlöschen könntest.Sonst kenne ich persönlich eigentlich nur immer so Einzelphänomene, also wo’s dann für eine Programmiersprache eine Bibliothek gibt, womit man dann ein Pattern z.B. mittels einer Builder-API zusammensetzen kann.
Die können dann oft auch zu einem Regex übersetzt werden, so dass man sie in bestehende APIs reinwerfen kann, die eben ein Regex erwarten.
Keine Ahnung, persönlich finde ich nicht, dass man sich dadurch das Erlernen von Regex sparen kann…
Nicht zu vergessen, die drölfzig verschiedenen Dialekte, und der Fakt dass das Werkzeug das Du gerade nutzen willst leider genau diese eine Funktion nicht unterstützt oder hinter einem neuen obskuren Sonderzeichen versteckt, dass es nicht auf Deiner Tastatur gibt.
Hast du ein Beispiel für so ein obskures Sonderzeichen?
Klar, aber ich kann es leider nicht eintippen :p