2012-09-04 3 views
5

Lookbehind를 욕심으로 얻는 방법?
이 경우 나는 lookbehind가 : if is가 있음을 원합니다. .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' 

나는만큼 당신이 후 몇 가지 긍정적를 넣어
@"(?i)(?<=\bsubject:?\s+).*?(?=\s*\r?$)" 

주위에 일을 찾았나요? 선택적인 욕심을 벗어난다. 같은 이유로 저는 앞으로 $를 넣어야했습니다.
하지만 선택형 욕심쟁이로 끝내야하는 경우 아래의 대답을 따라 가야합니다.

답변

4

흥미로운 점은 .NET에서 욕심이 없다는 것을 알지 못했습니다.

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

이것이 의미 : 여기에서 해결책

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

이 일치하도록 강제 ''있는 경우.

+0

조금 자세한 설명이 있지만 작동하고 그것이 나를 위해 작동합니다. 감사. 나는 그 lookbehind가 탐욕스럽지 않은 버그라고 생각합니다. – Paparazzi

+0

@Blam : 단순화하여 간략해질 수 있음을 깨달았습니다. 내 게시물을 업데이트했습니다. – porges

+0

아니요 컴파일러가 실패하거나 원래의 답변으로 돌아 가지 않습니다. rSubject = new Regex (@ "(? i) (? <= subject (: | (?!))) .......))"); – Paparazzi