Regex für übereinstimmende eingerückte Fortsetzungszeilen

8

Sie müssen key = value Paare in beliebigem Text mit den folgenden Regeln kombinieren.

  • Die führende Zeile hat eine Struktur:
    • Beginnen Sie mit der Einrückung - "zwei Leerzeichen oder Tab" einmal, z. B .: ( |\t)+
    • das Zeichen + und ein Leerzeichen
    • Wörter VAR oder CONST
    • und die key und value mit dem Zeichen =

Beispiele:

%Vor%

Die folgende Regex stimmt mit solchen Zeilen überein:

%Vor%

Nun das Problem: Die Syntax erlaubt Fortsetzungszeilen , z. Wenn auf die obige Zeile die Zeile folgt, die mindestens eine Einrückungssequenz beginnt, wird ( |\t) (auch ZWEI Leerzeichen oder eine Registerkarte genannt) als Fortsetzungszeile betrachtet und ihr gesamter Inhalt (auch mit führenden Leerzeichen) sollte value für sein der Schlüssel in der vorherigen Zeile.

Beispiel:

%Vor%

z. B. ist die Regex für die Fortsetzungszeile

%Vor%

Die Lösung ist einfach mit zeilenbasiertem Ansatz, z. wenn ich den ganzen Text in Zeilen aufteile und Zeile für Zeile abarbeite.

Aber ich suche nach einer (komplexen) Regex (hauptsächlich für Lern- und Benchmarkzwecke), die die key = value-Paare in einer oder mehrzeiliger Form abgleichen könnte. Versucht dies:

%Vor%

aber ich habe:

%Vor%

Nebenfrage: wie Sie die erweiterten Regexes mit mehreren Zeilen verwenden, wie:

%Vor%

wenn die Regex genau das SPACE-Zeichen enthalten muss (z. B. kann nicht das universelle \s verwendet werden)?

Wenn jemand Hilfe benötigt, ist hier ein Code, der die gewünschte Ausgabe erzeugt (unter Verwendung des zeilenbasierten Ansatzes) und auch die nicht arbeitende regex-based Lösung.

%Vor%

BEARBEITEN: Verwenden der akzeptierten Antwort und Hinzufügen der gewünschten Erfassungsgruppen, habe Folgendes:

%Vor%

EDIT2 Und ja, die auf Regex basierende Lösung ist 34% schneller (zumindest auf meiner HW).

    
cajwine 16.09.2016, 10:34
quelle

1 Antwort

4

Regex:

%Vor%

Live-Demo

Der wichtigste Teil ist der letzte Cluster:

%Vor%

Beantworten Sie Ihre zweite Frage :

Literale Leerzeichen werden einfach als bedeutender Teil von Regular Expression ignoriert, während x modifier gesetzt ist, es sei denn, Sie fügen ihn in die Zeichenklassen [ ] ein und verwenden Quantifizierer [ ]{2,} , um die Zeitpunkte anzugeben, zu denen sie erscheinen sollen.

%Vor%

Live-Demo

    
revo 16.09.2016, 11:00
quelle

Tags und Links