RegExp-Kurs 02: Metazeichen & Escaping

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
TuxPeter
Beiträge: 1966
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von TuxPeter » 16.04.2022 11:27:19

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
15.04.2022 17:42:10
TuxPeter schrieb:
Der umgekehrte Fall (meta als Standard, literal escaped) müsste eigentlich auch mit dem Progrämmchen erschlagen sein [...] einfach die Ausgabe vertauscht, [...]
[...]
Meillo schrieb:
Fast richtig. An welche Kleinigkeit hast du dabei nicht gedacht? ;-)
[...]

Code: Alles auswählen

 [ ... ]
 Literal-Zeichen ->     J    J@ ->#<-   // Lies: dies sind die Meta-Zeichen
   Meta-Zeichen -> DFDE REs!           // Lies: dies sind die Literal-Zeichen
Und siehe da: Dieses landet prompt in der falschen Rubrik.
Heißt, es landet bei den Meta-Zeichen (die hier dummerweise Literale heißen), sollte aber bei den Literalen landen, die hier (noch) als "Meta" falsch deklariert sind, das hatte ich dann doch richtig kapiert, das Progr. hatte ich ja noch nicht geändert.

Die Lösung war aber so schön in meinem Kommentar, was das Progrämmchen an der Stelle falsch macht, versteckt - ein echtes Verwirrspiel, das ich zu verantworten habe - Egal, aber ich denke, ich hab's jetzt: Esc.-Zeichen doppelt -> IMMER literal.

Huo
Beiträge: 614
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von Huo » 16.04.2022 16:17:04

Meine Lösungen der Aufgaben 13) und 14) in Python:

13) NoPaste-Eintrag41641
Anwendung auf Aufgabe 4):

Code: Alles auswählen

$ regex_2_13.py a l Haus
Haaus
14) NoPaste-Eintrag41642
Anwendung auf Aufgabe 9):

Code: Alles auswählen

$ regex_2_14.py "," m "hello, world"
meta "h", meta "e", meta "l", meta "l", meta "o", literales " ", meta "w", meta "o", meta "r", meta "l", meta "d"

Benutzeravatar
tegula
Beiträge: 439
Registriert: 04.06.2004 13:51:04
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von tegula » 20.04.2022 11:25:32

@ Huo: Wow! Kurz und trotzdem super gut verständlich :THX:. Falls ich später noch eine Korrektur meiner (bisher teilweise inkorrekten) Lösung zu Aufgabe 13 schreiben sollte, werde ich mich an deiner Lösung orientieren.

TuxPeter
Beiträge: 1966
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von TuxPeter » 21.04.2022 11:50:21

Na prima, da will ich doch meine neue Pascal-Version zum Zerpflücken einer RegEx-Eingabe in literale und nicht literale Zeichen auch noch mal vorzeigen. Sieht jetzt nicht mehr aus wie VHS-Pascal-Kurs Untertupfingen-Nord, die 3. Sitzung, sondern mindestens wie die 4. oder 6. Vor allem wird jetzt die Möglichkeit geboten, entweder den literalen Text oder den Meta-Text als nicht-escapten Standard zu interpretieren.
Damit alles hübsch untereinander steht, wird als Füllzeichen das einfache Anführungszeichen benutzt. (welches, nebenbei gesagt, im Pascal-Programm als literal escaped werden muss). Im RegEx kann man es trotzdem anwenden, aber in der Ausgabe nicht unterscheiden. Auf die Niederungen des UTF-Codes habe ich mich nicht eingelassen, d.h. mit deutschen Spezialitäten äöüß funktioniert es nicht korrekt, weil das 2-Byte-Codes sind. Ebenso habe auf die Meldung verzichtet, wie man das Programm beenden kann, wir sind ja hier unter uns.
Das Prog.:
NoPaste-Eintrag41650
Beispiel:

Code: Alles auswählen

Escape-Char: # literal=Standard? (j/n): j
Literaler Text ist Standard
         RegEx: a#bcd##e##f und#j#e#t#z#t#?!
Literaler Text: a''cd'#e'#f und''''''''''''!
      MetaText: ''b'''''''''''''j'e't'z't'?'

Escape-Char: # literal=Standard? (j/n): n
Literaler Text ist escaped
         RegEx: a#bcd##e##f und#j#e#t#z#t#?!
Literaler Text: ''b'''#''#''''''j'e't'z't'?'
      MetaText: a''cd''e''f und''''''''''''!

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von Meillo » 21.04.2022 12:27:48

Den dritten Teil des Kurses werde ich dann wieder zum Wochenende veroeffentlichen (also nach einer Woche Osterpause).

Nun aber mal zu den Aufgaben und Loesungen vom zweiten Teil.

Bei den Aufgaben 1 bis 3 gab's keine Probleme. Die waren klar.

Bei Aufgabe 4 gab es unterschiedliche Antworten. Huo hatte dann die richtige: viewtopic.php?t=183974&start=15#p1299872
Korrekt ist: Haaus
Das erste `a' ist noetig damit das zweite `a' als literales Zeichen interpraetiert wird. (Merke: zwei Escapezeichen hintereinander stehen immer fuer das Escapezeichen literal.)

Bei Aufgabe 5 waren die abgegebenen Loesungen beide korrekt.

Bei Aufgabe 6 im Prinzip auch, aber tegula hat einen Backslash zu viel, was vermutlich ein Vertipper war. Die Loesung von buhtz ist korrekt.

Aufgabe 7 war vielleicht zu offen formuliert und insgesamt etwas nervig, weil die ganzen Klammern mit der Zeit den Augen weh tun :roll: Meine Musterloesung:
Literale Zeichen sind die Standardzeichen.

(())()(()((()

Literal (, Literal ), Literal ), Metazeichen ), Literal (, Literal ), Literal (, Metazeichen )
Bei Aufgabe 8 gab's wieder ein bisschen mehr Unterschiede, wobei diese mehr aus der ungenauen Aufgabenbeschreibung herruehren. Am meisten meinen Erwartungen entsprochen hat die Loesung von Huo: viewtopic.php?t=183974&start=15#p1299886

Bei Aufgabe 9 ist Huos Programmausgabe gut: viewtopic.php?t=183974&start=45#p1299979
Vermutlich war ich nicht deutlich genug was ich mit ``beschreibe den Ausdruck'' gemeint habe. Ich hatte an eine solche Auflistung gedacht, ob jedes Zeichen literal oder als Metazeichen interpraetiert wird. Verstanden haben es die anderen inhaltlich wohl auch, sie haben nur andere Formen der Antwort gewaehlt. ;-)

Bei Aufgabe 10 waren die Antworten korrekt.

Bei Aufgabe 11 an sich auch, abgesehen von der anfaenglichen Verwirrung mit dem mit sich selbst escapten Escapezeichen, das dann kein Metazeichen wird, sondern sich selbst literal darstellt.

Bei Aufgabe 12 passt die Loesung von tegula: viewtopic.php?t=183974&start=15#p1299866


Danke auch fuer eure aktiven Programmierereien bei den Aufgaben 13 und 14! :THX:

Ich denke, dass die hilfreich sind, um damit die eigenen Loesungen der anderen Aufgaben zu pruefen. Das gilt eigentlich allgemein: Wenn man fuer ein Thema eine eigene Programmumsetzung schreibt, dann ist das sowohl eine gute Methode, um das eigene Verstaendnis zu pruefen, und man erlangt damit einen Kontrollmechanismus und wie eine zweite Perspektive auf die Aufgaben. Hier war es ja mit wenig Code moeglich.

Naeher angeschaut habe ich mir eure Programme nicht. Das koennt ihr auch gegenseitig tun. Mir ist es nur recht, wenn nicht alles an mir haengt. Bei der Erarbeitung der Loesungen zu den anderen Aufgaben hat das ja toll funktioniert.

Ich poste meine Umsetzung in C gleich auch noch.


Gibt es nun noch offene Fragen zu dieser Einheit oder den Aufgaben?
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von Meillo » 21.04.2022 12:31:32

Nachdem der Pastebin keine Dateien *.c annehmen wollte, poste ich sie kurzerhand direkt hier:

Zu 13)

Code: Alles auswählen

#include <stdio.h>

int
main(int argc, char *argv[])
{
        char *esc;
        int litdefault;
        int escaped;
        int c;

        if (argc != 3) {
                fprintf(stderr, "Usage: %s ESCAPE {M|L}\n", argv[0]);
                return 1;
        }

        esc = argv[1];
        if (esc[1] != '\0') {
                fprintf(stderr, "Escape character must be a single character\n");
                return 2;
        }
        litdefault = *argv[2] == 'L';

        while ((c=getchar()) != EOF) {
                if (c == *esc) {
                        printf("%s%c", esc, c);
                } else {
                        printf("%s%c", (litdefault ? "" : esc), c);
                }
        }
        putchar('\n');
        return 0;
}
Zu 14)

Code: Alles auswählen

#include <stdio.h>

int
main(int argc, char *argv[])
{
        char esc;
        int litdefault;
        int escaped;
        int c;

        if (argc != 3) {
                fprintf(stderr, "Usage: %s ESCAPE {M|L}\n", argv[0]);
                return 1;
        }

        esc = *argv[1];
        litdefault = *argv[2] == 'L';

        while ((c=getchar()) != EOF) {
                if (escaped) {
                        if (c == esc) {
                                printf("Literal %c\n", c);
                                escaped = 0;
                        } else {
                                printf("%s %c\n", (litdefault ? "Meta" : "Literal"), c);
                                escaped = 0;
                        }
                } else {
                        if (c == esc) {
                                escaped = 1;
                        } else {
                                printf("%s %c\n", (litdefault ? "Literal" : "Meta"), c);
                        }
                }
        }
        return 0;
}

Aufrufbeispiele fuer die Aufgaben 4 und 8:

Code: Alles auswählen

:-/ printf %s Haus | ./02-13 a L
Haaus

:-/ printf %s A,BCD,E,FG,,H | ./02-14 , L
Literal A
Meta B
Literal C
Literal D
Meta E
Meta F
Literal G
Literal ,
Literal H
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3565
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: RegExp-Kurs 02: Metazeichen & Escaping

Beitrag von heisenberg » 04.05.2022 16:06:03

IdRegExpKurs2022
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten