2010-10-28 28 views
6

Digamos que tengo una cadena de múltiples líneas como esto:¿Cómo hacer una búsqueda Regex de "coincidencia mínima" en C#?

STARTFRUIT 
banana 
ENDFRUIT 

STARTFRUIT 
avocado 
ENDFRUIT 

STARTVEGGIE 
rhubarb 
ENDVEGGIE 

STARTFRUIT 
lime 
ENDFRUIT 

Quiero buscar todas las frutas, no hay verduras. Trato esto:

MatchCollection myMatches = Regex.Matches(tbBlob.Text, "STARTFRUIT.*ENDFRUIT", RegexOptions.Singleline); 

foreach (var myMatch in myMatches) 
{ 
    Forms.MessageBox.Show(String.Format("Match: {0}", myMatch), "Match", Forms.MessageBoxButtons.OK, Forms.MessageBoxIcon.Information); 
} 

El problema es, en mi lugar de devolver un conjunto de tres partidos, me da un gran partido que abarca el primer STARTFRUIT y el comienzo y el último ENDFRUIT al final. ¿Hay alguna manera de "minimalizar" la búsqueda de coincidencias? No veo ninguna ayuda en RegexOptions.

Respuesta

21

Usar un (un signo de interrogación) non-greedy modifier después del cuantificador:

 
"STARTFRUIT.*?ENDFRUIT" 
      ^
     add this 

Nota que el signo de interrogación que aquí tiene un significado diferente aquí que cuando se utiliza como un cuantificador, donde significa "igualar a cero o uno".

Cuestiones relacionadas