2012-09-04 10 views
5

¿Cómo conseguir que el lookbehind sea codicioso?
En este caso, quiero que el lookbehind consuma: si está presente..NET Regex Lookbehind Not Greedy

m = Regex.Match("From: John", @"(?i)(?<=from:)...."); 
// returns ' Jon' what I expect not a problem just an example 

m = Regex.Match("From: John", @"(?i)(?<=from:?)...."); 
// returns ': Jo' 
// I want it to return ' Jon' 

He encontrado un trabajo en torno

@"(?i)(?<=\bsubject:?\s+).*?(?=\s*\r?$)" 

Mientras pones un poco después de la afirmativa? luego se saca el codicioso opcional del juego. Por la misma razón, tuve que poner $ en la mirada hacia adelante.
Pero si necesita terminar con un codicioso opcional, entonces tiene que ir con la respuesta aceptada a continuación.

Respuesta

4

Interesante, no me di cuenta de que no eran codiciosos en .NET. Aquí es una solución:

(?<=from(:|(?!:))) 

Esto significa:

(
    :  # match a ':' 
    | 
    (?!:) # otherwise match nothing (only if the next character isn't a ':') 
) 

Esto obliga a coincidir con el ':' si está presente.

+0

Poco detallado pero funciona y eso funciona para mí. Gracias. Considero un error que el aspecto detrás no sea codicioso. – Paparazzi

+0

@Blam: Acabo de darme cuenta de que esto se puede simplificar para que sea menos detallado. Actualicé mi publicación. – porges

+0

No falla el compilador, por favor, corrija o regrese a la respuesta original rSubject = new Regex (@ "(? I) (? <= Subject (: | (?!:))) ........)"); – Paparazzi

Cuestiones relacionadas