2009-11-17 6 views
0

파싱해야 할 파일이 많으며 파일 이름에 두 개의 날짜 패턴 중 하나가 있습니다 (시스템을 업그레이드하는 중이고 파일 파서를 새롭거나 오래된 두 가지 날짜 형식을 모두 인식 할 수 있음).C# 지연 정규식 일치

파일 이름은 <fileroot>_yyyyMMdd.log 또는 <fileroot>_MMddyy.log 중 하나처럼, 나는 내가의 수를 구문 분석하는 ^.*(\\d{6,8}).*$ 또는 ^.*(\\d{6}|\\d{8}).*$ 같은 정규 표현식을 사용하려고 할 때마다, 그러나, 날짜를 구문 분석 할 숫자를 구문 분석 할 수 있어야합니다 날짜의 경우 캡처 그룹은 파일 이름이 8 자리 인 경우에도 길이가 항상 6 자입니다.

C#의 정규 표현식 라이브러리가 정규 표현식과 일치하도록 가능한 한 철저하게 작성되도록하는 방법이 있습니까? C#/.NET이 아닌 Java로하는 법을 알고 있습니다. 저는이 언어에서 꽤 새로 왔습니다.

^.*(\\d{6,8})\.log$ 

이 순서의 모든 8 개 자리를 소비하는 정규식 엔진을 강제로 :

답변

3

문제는 ". *"입니다. 정규 표현식은 욕심이 많으므로 가능한 많은 기호와 일치합니다. - 당신은 항상 자리

2) .*[^\\d](\\d{6,8})

3) .*?(\\d{6,8})

전에 _이있는 경우이 같은 문제가 것

1) .*_(\\d{6,8}) : 처음 두 자리

솔루션 포함 Java에서 Regex는 어디에서나 욕심이 있습니다.

+0

# 1 트릭을했는데, 도와 주셔서 대단히 감사합니다. –

1

당신은 날짜가 항상 알려진 문자열 뒤에 알고 있다면, 그 문자열을 일치 강제로 정규식을 변경할 것 후행 \.log과 일치시킵니다.

+0

시도해도 작동하지 않습니다. 해당 정규 표현식을 사용하여 fileroot_20091117.log와 비교할 때 .NET 정규 표현 엔진의 (외관상 기본적으로) 게으른 일치가 '091117'이됩니다. –