2010-06-28 5 views
3

Dans l'exemple suivant, je voudrais récupérer le texte entre pMAINp et le premier pMDSp. Le regex a un look-derrière et un look-ahead:Lazy Regex Match in .NET. Quel est le problème ici?

string contents = "pMAINp MAP B FlightTest Load pMDSp ZutiCarrier pWingp some pMDSp more pWingp end"; 
string blockMainRegex = @"(?<=pMAINp)[\s\w+]+(?=(pMDS)?)"; 

Le résultat que j'espérais était: "CARTE B FlightTest Load"

mais ce qu'il revient est: « CARTE B FlightTest Charger pMDSp ZutiCarrier pWingp certains pMDSp plus pWingp end "

Vous remarquerez que j'essaye une correspondance paresseuse ici: (pMDS)? ce qui ne marche clairement pas! Toute aide à ce sujet serait grandement appréciée. Merci. :-)

EDIT: Oups, le texte recherché a été corrigé.

Cela fonctionne très bien:
chaîne blockMainRegex = @ "(? < = pMAINp)? [\ S \ w +] + (? = PMD)";

+0

+1 - Juste la question dont j'avais besoin de répondre. – Brett

Répondre

3

Vous remarquerez que je tente ici un match paresseux: (PMD)? ce qui ne marche clairement pas!

Vous semblez mal comprendre comment fonctionne la paresseuse.

Vous appliquez l'opérateur paresseux à un quantificateur - *, +,? etc. - partout ailleurs, il est interprété comme "zéro-ou-un".

Si vous voulez une partie de la regex pour correspondre à moins de caractères possible, appliquer l'opérateur paresseux pour le quantificateur associé à cette partie de la regex - dans ce cas, vous voulez l'utiliser comme ceci:

[\s\w+]+? 
1
string blockMainRegex = @"pMAINp(.*?)pMDSp"; 

Le premier groupe aura ce que vous voulez. .: par exemple

Regex re = new Regex(@"pMAINp(.*?)pMDSp"); 
string result = re.Match(contents).Groups[1].ToString(); 

+0

Merci, en fait j'ai fait une erreur avec le texte recherché. Non corrigé – MrGreggles

+0

@Gregg, d'accord, j'ai mis à jour ma solution. –

+0

Merci Matthew. Vous = top guy. – MrGreggles