Ich versuche String im folgenden Format zu parsen (EBNF, ich hoffe, das ist richtig) in PHP:
%Vor% Dabei ist <str>
eine Zeichenfolge, die [a-zA-Z0-9\-]+
Im Folgenden finden Sie ein Beispiel für Muster, die analysiert werden müssten:
%Vor%Ich versuche ein RegEx-Muster zu schreiben, das mir immer vier Gruppen geben würde:
<expression>
. Aus dem obigen Beispiel wäre das:
token1
token1
token1
token1&token2
token1&token2|(token3&!token4)
["!"]
vorhanden war. I.e.
null
null
null
null
!
<modifier>
für die nächste <expression>
(falls vorhanden). Das wäre:
null
&
|
|
|
null
token2
token2&!token3
token3&(token4|(!token5,12&token6))
token5,12
Ich kann das analysieren, vorausgesetzt, der erste Ausdruck enthält keine <modifier>
s.
Ich stecke an diesem Punkt fest. Ich habe versucht, Lookarounds zu verwenden, aber ich kann nicht herausfinden, wie sichergestellt werden kann, dass die Gruppe erfasst wird, wenn alle Klammern ausgeglichen sind. Ist dies mit RegEx möglich oder muss ich Code schreiben, der Schleifen usw. verwendet?
Soweit ich weiß, ist es unmöglich.
Sie haben eine kontextfreie Grammatik (EBNF ist für diesen Typ von Grammatiken - Typ-2-Grammatiken), die nicht mit regulären Ausdrücken geparst werden können (die für normale Grammatiken - Typ-3-Grammatiken sind).
Als Beispiel für die Sache, die Sie hier nicht behandeln können: Anzahl der öffnenden Klammern - Sie können nur eine Regexp für jede Zahl schreiben (aber es kann unendlich sein, oder?), sonst gibt es keine Möglichkeit zu sagen, ob Anzahl der übereinstimmenden schließenden Klammern ist gleich. Es gibt keine Möglichkeit zu zählen, wie viele Zeichen durch den spezifischen Teil von Regexp mit Quantifizierern ( +
, *
, etc.)