2012-09-04 14 views
5

Come ottenere il look per essere avido?
In questo caso voglio che il lookbehind consumi: se è 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' 

Ho trovato un lavoro intorno

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

Finché si mette un po 'affermativa dopo il? poi toglie l'avidità opzionale fuori dal gioco. Per la stessa ragione ho dovuto mettere $ in avanti.
Ma se hai bisogno di finire con un avido opzionale, allora devi andare con la risposta accettata qui sotto.

risposta

4

Interessante, non mi ero reso conto che non erano avidi in .NET. Ecco una soluzione:

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

Ciò significa:

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

Ciò costringe a corrispondere al ':' se presente.

+0

Piccolo prolisso ma funziona e funziona per me. Grazie. Lo considero un bug che il lookbehind non è avido. – Paparazzi

+0

@Blam: Ho appena realizzato che questo può essere semplificato per essere meno dettagliato. Ho aggiornato il mio post. – porges

+0

No, non riesce il compilatore, correggi o ritorna alla risposta originale rSubject = new Regex (@ "(? I) (? <= Subject (: | (?!:))) ........)"); – Paparazzi

Problemi correlati