(PHP) Parsing RegEx string - balancierende Klammern

8

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\-]+

übergeben würde

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:

  1. Der linkeste <expression> . Aus dem obigen Beispiel wäre das:
    • token1
    • token1
    • token1
    • token1&token2
    • token1&token2|(token3&!token4)
  2. Wenn ["!"] vorhanden war. I.e.
    • null
    • null
    • null
    • null
    • !
  3. Die <modifier> für die nächste <expression> (falls vorhanden). Das wäre:
    • null
    • &
    • |
    • |
    • |
  4. Der Rest des Musters.
    • null
    • token2
    • token2&!token3
    • token3&(token4|(!token5,12&token6))
    • token5,12

Ich kann das analysieren, vorausgesetzt, der erste Ausdruck enthält keine <modifier> s.

%Vor%

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?

    
Bart Platak 07.07.2012, 20:40
quelle

1 Antwort

1

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.)

verknüpft sind     
scriptin 07.07.2012 20:54
quelle

Tags und Links