13 Stimmen

Compiler für reguläre Ausdrücke

Bei meiner Arbeit habe ich nur wenige Male reguläre Ausdrücke verwenden müssen. In diesen wenigen Fällen habe ich jedoch eine sehr leistungsfähige Ausdrucksform entdeckt, mit der ich einige äußerst nützliche Dinge tun kann.

Das Problem ist, dass die für reguläre Ausdrücke verwendete Sprache falsch ist - Punkt.

Aus psychologischer Sicht ist dies falsch - die Verwendung von körperlosen Symbolen ist nur für Menschen mit einem eidetischen Gedächtnis eine nützliche Referenz. Die syntaktischen Regeln sind zwar klar umrissen, aber nach meiner Erfahrung und dem, was ich von anderen gelernt habe, kann sich die Entwicklung eines erfolgreich funktionierenden regulären Ausdrucks in allen außer den trivialsten Situationen als schwierig erweisen. Dies ist verständlich, da es sich um ein symbolisches Analogon zur Mengenlehre handelt, die eine ziemlich komplizierte Sache ist.

Es kann sich als schwierig erweisen, den Ausdruck, an dem Sie arbeiten, in seine einzelnen Teile aufzulösen. Aufgrund der Beschaffenheit der Sprache ist es möglich, einen regulären Ausdruck auf mehrere Arten zu lesen, wenn man sein primäres Ziel nicht versteht, so dass die Interpretation der Regexes anderer Leute kompliziert ist. In der Lehre von der natürlichen Sprache wird dies als Pragmatik bezeichnet.

Die Frage, die ich stellen möchte, lautet also: Gibt es so etwas wie einen Compiler für reguläre Ausdrücke? Oder kann man überhaupt einen bauen?

Man könnte Regexe, metaphorisch gesehen, als Assembler betrachten - es gibt einige Ähnlichkeiten. Könnte man einen Compiler entwickeln, der eine natürlichere Sprache - eine höhere Sprache - in reguläre Ausdrücke umwandelt? Dann könnte ich in meinem Code meine Regexe unter Verwendung der höheren Sprache in einer Header-Datei definieren und sie bei Bedarf durch eine symbolische Referenz referenzieren. Ich und andere könnten von meinem Code aus auf die Header-Datei verweisen und leichter verstehen, was ich mit meinen Regexes erreichen will.

Ich weiß, dass es von einem logischen Standpunkt aus möglich ist, sonst wären Computer nicht möglich, aber wenn Sie bis hierher gelesen haben, würden Sie dann in Erwägung ziehen, die Zeit zu investieren, um es zu realisieren?

4 Stimmen

Ich finde reguläre Ausdrücke recht einfach zu lesen.

1 Stimmen

Ich denke, die Mehrdeutigkeit einer natürlichen Sprache könnte die Komplikationen eher vergrößern als verringern. Regex scheint anfangs entmutigend zu sein, besonders Dinge wie Backtracking und nicht gierige Operatoren. Nachdem ich kürzlich Regex neu erlernt habe, habe ich einen Abend lang intensiv gelernt, um das meiste zu verstehen. Ich bin mir jedoch sicher, dass jemand mit mehr Erfahrung mich bei Regex leicht übertreffen kann. Wie bei allem, was man wissen sollte, kommt es auf Übung und Ausdauer an.

0 Stimmen

Die Antwort von Andrea Ambu ist eine große Hilfe für alle, die Probleme mit Regex haben. Das ist in etwa das, was ich meinte, aber ich hatte wirklich gehofft, dass es eine Bibliothek mit Makros oder Ähnlichem für verschiedene Programmiersprachen gibt, mit der man eine Textsuche mit einer kombinatorischen Syntax usw. definieren kann. Die Menschen haben unterschiedliche mentale Modelle, und einige Programmierer, mich selbst eingeschlossen, finden es praktisch unmöglich, mit Regex zu arbeiten, obwohl es Drittanbieter gibt, die sie für wenig Geld schreiben. Wenn man regelmäßig damit arbeitet, ist es einfacher, aber wenn es sich nur um ein gelegentliches Projekt handelt, ist es schwierig.

5voto

Andrea Ambu Punkte 36268

Wie wäre es, sie mit Regex-Kumpel und fügen Sie die erzeugte Beschreibung als Kommentar in Ihren Code ein?

0 Stimmen

+1: regex ist extrem schwer zu lesen, aber das ist ein Problem der Werkzeuge, nicht der Sprache

5voto

Torsten Marek Punkte 78610

Reguläre Ausdrücke (nun ja, "echte" reguläre Ausdrücke, nicht dieses moderne Zeug) sind endliche Zustandsmaschinen. Daher erstellt man eine Syntax, die reguläre Ausdrücke in Form von Zuständen, Kanten, Eingabe- und möglicherweise Ausgabebezeichnungen beschreibt. Die fsmtools <a href="http://web.archive.org/web/20140321151352/http://www.research.att.com/%7Efsmtools/fsm/" rel="nofollow noreferrer">[Webarchiv] </a> von AT&T unterstützen so etwas, aber sie sind weit davon entfernt, ein alltagstaugliches Werkzeug zu sein.

Die Sprache in XFST <a href="http://web.archive.org/web/20161130154831/http://www.cis.upenn.edu/%7Ecis639/docs/xfst.html" rel="nofollow noreferrer">[Webarchiv] </a> , das Xerox Finite-State-Toolkit, ist ebenfalls ausführlicher.

Abgesehen davon würde ich sagen, dass Sie, wenn Ihr regulärer Ausdruck zu komplex wird, zu etwas mit größerer Ausdruckskraft übergehen sollten.

5voto

innaM Punkte 46916

Über so etwas bin ich noch nie gestolpert. Und ich glaube nicht, dass so etwas nützlich wäre.

Diese höhere Sprache wäre sehr langatmig, und ich schätze, dass man ziemlich lange Anweisungen bräuchte, um einen regulären Ausdruck von durchschnittlicher Komplexität zu erstellen.

Vielleicht haben Sie die regulären Ausdrücke einfach nicht oft genug verwendet. Glauben Sie mir, mein Gedächtnis ist weit davon entfernt, eidetisch zu sein (oder gar gut), aber ich habe selten Probleme, reguläre Ausdrücke zu erstellen oder die meiner Kollegen zu verstehen.

3voto

Es gibt Möglichkeiten, REs in ihrer üblichen Form besser lesbar zu machen (z.B. das Perl /x Syntax), und mehrere viel wortreichere Sprachen, um sie auszudrücken. Siehe:

Ich stelle jedoch fest, dass viele alte Hasen sie nicht zu mögen scheinen.

Es gibt keinen grundsätzlichen Grund, warum man nicht einen Compiler für eine wortreiche RE-Sprache schreiben könnte, der auf eine kompakte Sprache abzielt, aber ich sehe darin keinen großen Vorteil. Wenn Sie die wortreiche Form mögen, verwenden Sie sie einfach.

3voto

13ren Punkte 11339

Das "Inhaltsmodell" von XML Schema ist ein Beispiel für das, was Sie wollen.

c(a|d)+r

kann als Inhaltsmodell in XML Schema wie folgt ausgedrückt werden:

<sequence>
 <element name="c" type="xs:string"/>
 <choice minOccurs="1" maxOccurs="unbounded">
  <element name="a" type="xs:string"/>
  <element name="d" type="xs:string"/>     
 </choice>
 <element name="r" type="xs:string"/>
<sequence>

Relax NG hat einen anderen Weg, um die gleiche Idee auszudrücken. Es muss nicht unbedingt ein XML-Format sein (Relax NG hat auch eine entsprechende Nicht-XML-Syntax).

Die Lesbarkeit von Regex wird durch das notwendige Escaping beeinträchtigt, und ein Format wie das obige reduziert die Notwendigkeit dafür. Die Lesbarkeit von Regex wird auch beeinträchtigt, wenn die Regex komplexer wird, da es keine systematische Möglichkeit gibt, größere reguläre Ausdrücke aus kleineren zusammenzusetzen (obwohl man Zeichenketten verketten kann). Modularität hilft normalerweise. Aber für mich ist die kürzere Syntax wesentlich einfacher zu lesen (ich konvertiere oft XML-Schema-Inhaltsmodelle in Regex, um mir die Arbeit damit zu erleichtern).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X