Reguläre Ausdrücke: Zeichenkette anhand von Kommata trennen

Parantatatam

mag Cookies & Kekse
Hallo liebe Gemeinde,

ich will mal wieder ein Problem veröffentlichen. Und zwar liegt jenes darin vor, dass ich mich gerade mal mit EBNF und ABNF auseinandersetze und eine Funktion schreiben will, die diese Grammatiken dann in ein Muster von regulären Ausdrücken umwandelt, um dann wiederum andere Sachen zu parsen. Aber das ist nicht mein Problem.

Mein Problem liegt darin, dass ich die Definitionen anhand von Kommata trennen will. Allerdings darf das Komma nicht innerhalb von einfachen und doppelten Anführungsstrichen liegen und ebenfalls nicht innerhalb eines Kommentares. Kommentare beginnen mit (* und enden mit *). Weiß jemand, wie man das lösen kann?

Mein bisheriger Ansatz sieht so aus, funktioniert letztendlich aber nicht:
Code:
(^(".*")|^('.*')|^(\(\*.*\*\))|;)
 
Funktioniert leider nicht. Ich habe als Beispielskript das hier genommen:
Code:
(* ein einfaches Beispiel in EBNF ? Wikipedia *)
Programm = 'PROGRAM' Bezeichner 
           'BEGIN' 
           { Zuweisung [";"] } 
           'END' "." ;
Bezeichner = Buchstabe { ( Buchstabe | Ziffer ) } ;
Zahl = [ "-" ] Ziffer { Ziffer } ;
String = '"' { AlleZeichen ? '"'} '"' ;
Zuweisung = Bezeichner ":=" ( Zahl | 
                              Bezeichner |
                              String ) ;
Buchstabe = "A" | "B" | "C" | "D" | "E" | "F" | "G"
          | "H" | "I" | "J" | "K" | "L" | "M" | "N"
          | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
          | "V" | "W" | "X" | "Y" | "Z" ;
Ziffer = "0" | "1" | "2" | "3" | "4" | "5" | "6" 
       | "7" | "8" | "9" ;
AlleZeichen = ? alle sichtbaren Zeichen ? ;
 
Verzeih mir den Fehler in meiner Formulierung. Das Problem, was ich meinte, was jetzt noch auftritt, ist, dass der Kommentar nicht erkannt wird. Das andere funktioniert natürlich.
 
Das Problem, was ich meinte, was jetzt noch auftritt, ist, dass der Kommentar nicht erkannt wird.
Was meinst du mit „nicht erkannt“? Mit dem oben genannten regulären Ausdruck werden Kommata/Semikola in Kommentaren nicht als Trennzeichen interpretiert. Zumindest habe ich noch kein Beispiel gefunden, wo es anders wäre. Oder meintest du was anderes? In solchen Fällen bitte einfach immer beschreiben a) was genau du gemacht hast, b) was dabei rausgekommen ist und c) was du stattdessen erwartet hättest. Das beugt Missverständnissen ungemein vor und vermindert somit die Zeit, bis du eine hilfreiche Antwort erhältst.

Grüße,
Matthias
 
Wie schon gesagt, möchte ich das Ganze dafür verwenden, dass es später in einen regulären Ausdruck umgewandelte werden kann. Dementsprechend sollten Kommentare gleich ignoriert werden, damit man sie gar nicht weiter parsen muss.
 
Ah, jetzt kommen wir der Sache schon näher. Bisher ging es ja nur darum, die einzelnen Regeln voneinander zu trennen. Die Kommentare könntest du einfach vorher mittels preg_replace in Verbindung mit dem Ausdruck \(\*.*?\*\) entfernen.

Grüße,
Matthias
 
Ich danke dir vielmals, aber hatte gehofft, dass man das vielleicht alles in eine Anweisung setzen könnte. Aber gut, wenn es nicht sein soll, so bin ich auch mit dieser Möglichkeit zufrieden. Ab diesem Punkt komme ich dann selber weiter und ich werde demnächst mal wieder was von mir hören lassen und mein Projekt veröffentlichen.

Vielleicht noch etwas Hintergrundwissen zum Projekt: ich wollte einen Filter basteln, der eine URI nach RFC 3986 in all seine Bestandteile zerlegt. Allerdings ist das Zusammensetzen des regulären Ausdrucks per Hand äußerst mühselig gewesen und unübersichtlich. Da aber die Regeln in ABNF angegeben sind, kann man dies auch parsen und daraus automatisch einen Ausdruck erstellen. Außerdem ist es eine gute Übung für den ersten eigenen Parser dieser Art.
 
Zurück