(Es waere schoen, wenn wir von sommernacht wieder etwas hoeren wuerden. ich hoffe, dass tatsaechliches Interesse an der Sache vorhanden ist. Wir kehren gerne zum eigentlichen Thema zurueck und lassen die Exkurse sein, wenn es dort weitergeht.)
hikaru hat geschrieben: 16.09.2021 21:58:16
Meillo hat geschrieben: 16.09.2021 15:30:52
Nee, wir haben regulaere Ausdruecke.
(... in einem Dutzend verschiedener Arten.
)
Das wären dann Dialekte.
Du antwortest so ernst -- das war eigentlich nur ein lustiges Wortspiel.
Aber in deinem Vergleich hast du Recht.
hikaru hat geschrieben: 16.09.2021 21:58:16
Man mag sie zwar nicht beherrschen, aber wenn man sie sieht/hört versteht man sie wenigstens meistens.
Genau.
hikaru hat geschrieben: 16.09.2021 21:58:16
Viel mehr wurmt mich bei Regex immer noch die Inkonsistenz, dass das Zirkumflex kontextsensitiv ist:
Der Punkt in
'.abc' und
'[.abc]' macht das Gleiche. Der einzige Unterschied im Verhalten ergibt sich aus der Klammer.
Aber
'^abc' bedeutet etwas ganz anderes als
'[^abc]'. Dafür hätte man ruhig verschiedene Zeichen nehmen können. Aber ich glaube, das hatte ich an anderer Stelle schon mal erwähnt.
Ich verstehe, dass diese Kontextabhaengigkeit die Sache schwerer macht. Auch, dass die Negation nicht mit dem Ausrufezeichen gemacht wird, wie ueblich in den Programmiersprachen von Unix, ist ungewohnt. Ich weiss nicht, welche vorigen Regexp-Implementierungen es gab, bevor Ken Thompsen sie in ed eingebaut hat. Vielleicht hat er ja nur Notationen aufgegriffen, die damals ueblich waren.
Wenn es weniger Sonderzeichen gibt, die mehrfach belegt sind, hat das zumindest den Vorteil, dass man weniger Zeichen escapen muss. Es ist zwar zum Lesen der RE einfacher wenn jede Sonderfunktion ein eigenes Zeichen hat, aber zum Schreiben ist es schwieriger wenn es mehr Zeichen gibt, die Sonderbedeutungen haben. Darum, finde ich, ist es nicht so einfach gesagt, was besser waere.
Die Extended Regular Expressions (ERE, also die aus egrep, im Gegensatz zu den Basic Regular Expressions, BRE, in grep) sind insgesamt deutlich besser designt. So ist es halt immer: Wenn man mit der existenten Form nicht einverstanden ist, dann kann man die zwar besser machen, hat dann aber zwei Formen mit denen man sich rumschlagen muss. Jedenfalls ist der grosse Vorteil an EREs, dass in ihnen jedes Zeichen, wenn es escapt wird, fuer sich selbst steht, waehrend Sonderbedeutungen nur in unescapter Form greifen. Da muss man sich also weniger merken und kann, wenn man unsicher ist, einfach escapen.
Aber nochmal hierzu:
hikaru hat geschrieben: 16.09.2021 21:58:16
Der Punkt in
'.abc' und
'[.abc]' macht das Gleiche. Der einzige Unterschied im Verhalten ergibt sich aus der Klammer.
Aber
'^abc' bedeutet etwas ganz anderes als
'[^abc]'.
Ich weiss nicht, ob ich dich richtig verstehe. Der Punkt macht doch auch nicht das Gleiche. In `.abc' matcht er auf ein beliebiges Zeichen, in `[.abc]' matcht er auf einen Punkt.
Nun gut, der Circumflex ist schon noch etwas kompilizierter. Dich stoert wohl, dass er zwei *verschiedene* Sonderbedeutungen hat: In `^abc' verankert er die RE am Zeilenanfang (ohne etwas zu matchen), in `[^abc]' negiert er die Zeichenklasse, und in `a^bc' oder `[a^bc]' matcht er auf sich selbst literal.
Fuer dich ist das wohl nicht die gleiche Art von Kontextabhaengigkeit, die besagt: Je nach Kontext bedeutet das Zeichen etwas anderes. Denn aus dieser Sicht ist die Situation fuer Punkt und Circumflex gleich: Verschiedene Kontexte, verschiedene Bedeutungen. Fuer dich scheint die Schwierigkeit darin zu liegen, dass es nicht nur das einfache Schema gibt -- literale Verwendung oder Sonderbedeutung -- sondern je nach Kontext verschiedene Sonderbedeutungen. Beides ist einfach nur eine Kontextabhaengigkeit, im einen Fall gibt es halt nur genau zwei Faelle, im anderen mehrere.
(Aber ja, fuer das Negieren von Zeichenklassen waere das Ausrufezeichen die bessere Wahl gewesen. Ich weiss nicht, warum es dafuer nicht verwendet worden ist. Allerdings muss man bedenken, dass REs schon 1969 in ed eingebaut worden sind, C aber erst von 1972 oder 1973 stammt. Insgesamt scheint Ken Thompson auch eine Vorliebe fuer den Circumflex gehabt zu haben, weil die Pipes in Shellpipelines anfangs auch so ausgesehen haben: `ls ^ wc -l' bis sie spaeter dann zu `ls | wc -l' geworden sind.)
(Die Entscheidung fuer die Sonderzeichen erschliesst sich einem wohl am besten dadurch, dass man ueberlegt, wie man am wenigsten escapen muss, wenn man in ed (oder vi) in assembler/roff/C-Code sucht. Im Code steht der Circumflex quasi nie am Zeilenanfang und das Dollarzeichen quasi nie ma Zeilenende, ueberall sonst in der Zeile kann man sie literal suchen. Mit so einem Denken erscheinen die getroffenen Entscheidungen sinnvoller als wenn man heutige Nutzungsszenarien im Kopf hat.)
Um zu verstehen, warum REs so designt sind wie sie es sind, muss mehr deutlich mehr vom Schreiben von REs aus denken als vom Lesen. Viele von euch werden sie wohl eher Lesen oder damit so eure Schwierigkeiten haben, darum erscheint das im Mittelpunkt zu stehen. Aber REs wurden eingefuehrt um in ed (also im Editor) zu Suchen, da schreibt man sie jeweils nur einmal und liest sie nie wieder. Auch in `grep' und `sed' was Tools zur oftmals interaktiven Verwendung auf der Kommandozeile waren, schreibt man sie viel eher als sie zu lesen.
Wenn man zudem eine gewisse Uebung mit REs hat, dann liest man sie fluessig, egal wie die Regeln von Sonderbedeutungen sind. Jedenfalls muss ich bei einfacheren REs gar nicht nachdenken und nur selten, wenn jemand wirklich komplizierte Dinge macht, muss ich sie aktiv dekodieren. Aus dieser Perspektive des Profi-Users (fuer den Unix immer in erster Linie war: ein System von Profis fuer sie selbst) und aus der Perspektive des Schreibens (die Mitarbeiter der Patentabteilung der Bell Labs, die ed nutzen und darin suchen koennen muessen) sind REs ziemlich gut designt, wuerde ich sagen. Deine Perspektive, die heute bestimmt fuer den Grossteil der User gilt, ist eine andere; ich kann nachvollziehen, dass dafuer manches nicht so passend erscheint.