2013-09-03 15 views
5

Ich versuche, den gesamten Text (dargestellt als xxxx) in den Folgemuster zu extrahieren:RegexMuster für Text zwischen zwei Saiten

Session["xxxx"] 

mit C#

Diese Request.Querystring["xxxx"] sein kann, so versuche ich, um den Ausdruck dynamisch zu erstellen. Wenn ich so tun, erhalte ich alle möglichen Probleme über unescaped charecters oder keine Treffer :(

könnte ein Beispiel sein:

string patternstart = "Session["; 
string patternend = "]"; 
string regexexpr = @"\\" + patternstart + @"(.*?)\\" + patternend ; 
string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; 

MatchCollection matches = Regex.Matches(sText, @regexexpr); 

jemand dabei helfen kann, wie ich bin ratlos (wie ich immer scheinen sein mit RegEx :))

+0

Ich versuche, das gleiche für ein VB-Projekt Session ("xxxx") – Arjang

Antwort

7

Mit ein paar kleinen Änderungen an Ihrem Code.

string patternstart = Regex.Escape("Session["); 
string patternend = Regex.Escape("]"); 
string regexexpr = patternstart + @"(.*?)" + patternend; 
+0

Sie vergessen, 'zu tun "". Dein Muster passt auch zu 'Session []' –

+0

@SriramSakthivel Hast du es vor dem Kommentieren getestet? Siehe die Verwendung: 'var stimmt überein = Regex.Matches (sText, regexexpr) .Cast () .Wählen (m => m.Gruppen [1] .Wert) .ToList();' – I4V

+0

Awsome ... danke – spanout

1

Die Zeichen [ und haben eine besondere Bedeutung mit regulären Ausdrücken - sie definieren eine Gruppe, in der eines der enthaltenen Zeichen übereinstimmen muss. Um dies zu umgehen, einfach ‚Escape‘ sie mit einem führenden Zeichen \:

string patternstart = "Session\["; 
string patternend = "\]"; 

Ein Beispiel „final String“ könnte dann sein:

Session\["(.*)"\] 

Sie können jedoch leicht Ihre RegEx schreiben zu handhaben Session, Abfragezeichen usw. automatisch, wenn Sie benötigen (ohne auch jede andere Anordnung passend Sie an ihm werfen), und zu vermeiden, dass die Zeichenfolge in erster Linie für den Aufbau:

(Querystring|Session|Form)\["(.*)"\] 

und dann tak e das zweite Spiel.

1

Das Muster, das Sie in Ihrem Beispiel konstruieren sieht ungefähr so ​​aus:

\\Session[(.*?)\\] 

Es gibt ein paar Probleme. Zuerst nimmt es an, dass die Zeichenfolge mit einem umgekehrten Schrägstrich beginnt, zweitens wird die gesamte (.*?) in eine Zeichenklasse eingeschlossen, das heißt, es passt auf jede einzelne offene Klammer, Periode, Sternchen, Fragezeichen, enge Klammer oder Backslash. Sie müssten den Klammern in Ihrem Muster entkommen, wenn Sie ein Literal [ übereinstimmen möchten.

Sie könnten ein Muster wie folgt verwenden:

Session\[(.*?)] 

Zum Beispiel:

string regexexpr = @"Session\[(.*?)]"; 
string sText = "Text to be searched containing Session[\"xxxx\"] the result would be xxxx"; 

MatchCollection matches = Regex.Matches(sText, @regexexpr); 
Console.WriteLine(matches[0].Groups[1].Value); // "xxxx"