2012-12-12 23 views
5

Einen sehr einfachen Skriptparser als Teil eines Schulprojekts schreiben, und während es nicht erforderlich ist, bin ich neugierig, wenn es mit nur einem regulären Ausdruck getan werden kann.Regex, ignorieren Muster, wenn es in Anführungszeichen ist

Die Syntax ist vergleichbar mit ASP, wobei ein Skript mit <% beginnt und mit%> endet.

Es unterstützt nur einen Befehl "pr", der mit Echo oder Response.Write identisch ist.

Im Moment habe ich diesen regulären Ausdruck bin mit Skriptblöcke zu finden:

(<%\s*([\s\S]*?)\s*%>) 

Aber wenn ich einen Befehl wie diesen haben:

<% pr "%>"; %> 

... es passt natürlich nur:

Gibt es eine Möglichkeit, reine Regex zu verwenden, um schließende Tags zu ignorieren, die in Anführungszeichen stehen? Meine Hauptsorge ist, dass es Tags, die zwischen Anführungszeichen stehen, aber tatsächlich außerhalb von ihnen findet, wenn das sinnvoll ist. Zum Beispiel ...

<% pr "hello world"; %> " 

Technisch ist der Schluss-Tag in Anführungszeichen, aber es ist nicht in einem „offenen“ und dann „Schließen“ Zitat, eher umgekehrt.

Wenn das mit Regex möglich ist, wäre das ziemlich ordentlich, ansonsten vermute ich, dass ich, wenn ich diese Funktionalität unterstützen möchte, manuell den eingehenden Text durchlaufen und die Blöcke selbst analysieren muss, was wirklich keine große Sache ist entweder.

Danke!

+0

Wenn Sie Ihre Angebote nicht aufeinander abgestimmt sind, ist es unmöglich. Zum Beispiel, warum sollte Ihr letztes Beispiel nicht auf '" <% pr "Hallo Welt";%> "' erweitert werden. Nicht sind beide '<%' and '%>' innerhalb oder außerhalb von Anführungszeichen? Kannst du versichern, dass in deinem letzten Beispiel das nachfolgende '' 'später in der Eingabe abgeglichen wird? –

Antwort

3

Ich denke, das sollte Ihren Bedürfnissen entsprechen: <%(".*?"|.*?)*?%> (siehe Demo).

Erläuterung:

Während .* Matches so lange wie möglich, .*? Streichhölzer so wenig wie möglich.

Zum Beispiel (unter Verwendung von Pseudo-Code),

"#foo# #bar#".matches(/#(.*)#/).group(1) // will return ["foo# #bar"] 

während

"#foo# #bar#".matches(/#(.*?)#/).group(1) // will return ["foo", "bar"] 
+1

Das funktioniert ganz gut! Ich habe es ein wenig massiert, um neue Zeilenzeichen einzufügen und füge die einfangenden Gruppen hinzu, die ich brauchte toll arbeiten. – ARW

Verwandte Themen