9 Stimmen

Regex für passende Anführungszeichen und einfache Anführungszeichen

Ich schreibe gerade einen Parser für ColdFusion-Code. Ich bin mit einem Regex (in c#), um den Namen datasource Attribut des cfquery-Tag zu extrahieren.

Die Regex lautet vorläufig wie folgt <cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")

es funktioniert gut für Zeichenketten wie <cfquery datasource="myDS" oder <cfquery datasource='myDS'

Aber es wird verrückt, wenn man Zeichenketten parst wie <cfquery datasource="#GetSourceName('myDS')#"

Offensichtlich ist der Teil der Regex (?:'|") die Ursache. Gibt es eine Möglichkeit, nur einfache Anführungszeichen zu finden, wenn die erste Übereinstimmung ein einfaches Anführungszeichen war? Und nur das doppelte Anführungszeichen, wenn die erste Übereinstimmung ein doppeltes Anführungszeichen war?

Vielen Dank im Voraus!

6voto

NullRef Punkte 3663

Bearbeiten: Ich denke, dies sollte in C# funktionieren Sie müssen nur einen Rückverweis zu tun:

datasource\s*=\s*('|")(.*)(?:\1)

oder vielleicht

datasource\s*=\s*('|")(.*)(?:$1)

passt zu datasource="#GetSourceName('myDS')#" mit einem Rückverweis auf die erste Übereinstimmung mit \1 .

Natürlich können Sie die erste Fanggruppe nicht ignorieren mit ?: und trotzdem funktioniert es. Vielleicht möchten Sie auch die Option lazy Flagge, um nicht mit zusätzlichen " 's

1voto

Greg Jackson Punkte 118

Ich würde vorschlagen, zwei verschiedene Regexe zu verwenden, wenn möglich, oder die Regex auf andere Weise aufzuteilen.

Für eine einzelne Regex, unter Berücksichtigung der von @Mike gestellten Frage, ("[^"]*")|('[^']*') Dann können Sie die Anführungszeichen auswerten.

Die andere Möglichkeit, dies zu tun, ist die Verwendung von Lookahead/Lookbehind, aber das neigt dazu, unübersichtlich zu werden und wird nicht allgemein unterstützt.

0 Stimmen

Für mich sieht es so aus, als ob in Ihrem Ausdruck das zweite * an der falschen Stelle steht, es sollte ("[^"]*")|('[^']*') sein... es sei denn, Sie wollten viele Konstanten mit nur einem Zeichen wie 'x''y''z' abgleichen.

1 Stimmen

Ich glaube, Sie haben Recht. Behoben. Dies behandelt auch nicht escaped einfache oder doppelte Anführungszeichen, aber die Frage und die Antwort sind so alt, dass ich es unvollständig lassen werde (obwohl jetzt korrekt).

0voto

Swift Punkte 12784

Schauen Sie sich diesen Beitrag an:

Wie kann ich eine durch Anführungszeichen getrennte Zeichenfolge mit einem Regex abgleichen?

Sie scheinen mit demselben Problem konfrontiert zu sein.

1 Stimmen

Danke für den Link. Es gab tatsächlich auch eine funktionierende Antwort auf mein Problem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X