2017-03-21 3 views
-1

Ich versuche zu extrahieren, ob Code-Blöcke aus einem Code mit regulären Ausdruck, aber wenn geschweifte Klammern im Code fehlt mein Browser von der Endlosschleife blockiert. Das ist mein regulärer Ausdruck und Beispiel-Code ohne geschweifte KlammerRegulärer Ausdruck Zeitüberschreitung

if\s*([A-z0-9]+)?\s*\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\} 

Beispiel:

if(true){ 
    if(true){ 

    } 


if(true){ 
} 

Wie Browser in diesem Fall, wenn möglich, von Timeout zu verhindern.

+0

Was ist der Grund für '([A-z0-9] +)? \ S *' zwischen 'if' und dem ersten' ('? – bluehipy

Antwort

0

Wenn die Eingabe, die Sie verarbeiten, ist extrem "regulär", reguläre Ausdrücke nicht helfe dir hier. Sie können nicht ausdrücken, dass Parantheses übereinstimmen müssen, zum Beispiel in einem einfachen regulären Ausdruck.

Wenn der zu analysierende Code einfach genug ist, können Sie einen eigenen Parser erstellen, der nur die Struktur kennt, die er für die gewünschte Extraktion benötigt. Sie haben nicht erwähnt, welche Sprache Sie analysieren möchten, aber von dem Tag "javascript" nehme ich an, dass es sich um Javascript handelt. Es könnte besser funktionieren als für C/C++ usw. Ansonsten müssen Sie sich einige bereits verfügbare Parser ansehen, die einen AST oder ähnliches erzeugen und von dort aus arbeiten.

0

Um ein bisschen indirekt zu antworten, könnten Sie einen ersten Durchgang machen, einfach um Bracket-Zählungen zu überprüfen. Klammern in Kommentaren oder Strings werden dies jedoch wahrscheinlich durcheinander bringen, und das gilt für syntaktisch gültige Eingaben genauso wie für Ihr Beispiel. (Mein erster Instinkt ist, dass dies ein bisschen wie die "Nie verwenden Regex zu HTML-Analyse" Gespräch, aber ich könnte falsch.)