2012-09-04 16 views
5

Wie man den Lookbehind dazu bringt, gierig zu sein?
In diesem Fall möchte ich das Lookbehind verbrauchen: Wenn vorhanden ist..NET Regex Lookbehind Nicht Gierig

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' 

fand ich eine Arbeit um

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

Solange Sie nach dem etwas bejahend setzen? dann nimmt es das optionale Greedy aus dem Spiel. Aus dem gleichen Grund musste ich den $ in den Blick nach vorne bringen.
Aber wenn Sie auf einem optionalen gierig enden müssen, dann müssen Sie mit der akzeptierten Antwort unten gehen.

Antwort

4

Interessant, ich wusste nicht, dass sie in .NET nicht gierig waren. Hier ist eine Lösung:

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

Das bedeutet:

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

Dies zwingt es die passen ':', falls vorhanden.

+0

Wenig wortreich, aber es funktioniert und das funktioniert für mich. Vielen Dank. Ich halte es für einen Fehler, dass der Lookbehind nicht gierig ist. – Paparazzi

+0

@Blam: Nur realisiert, dass dies vereinfacht werden kann, um weniger wortreich zu sein. Ich habe meinen Beitrag aktualisiert. – porges

+0

Nein, dass der Compiler nicht funktioniert, bitte korrigieren oder zurück zur ursprünglichen Antwort rSubject = new Regex (@ "(? I) (? <= Betreff (: | (?!:))) ........)"); – Paparazzi