2010-12-29 3 views
2

정규식 결과가 너무 길어서 결과 일치

<(\d+)>(\d+\.\d+|\d{4}\-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\..*?)*\s+(ALER|NOTI) 

이것은 내 입력입니다 (전혀 일치하지 않습니다)

이것은 결과와 일치하지 않는 을 반환하지만 결과를 출력하는 데 너무 오래 걸립니다. 1 초에 수천 개의 로그/입력이 있기 때문에 모든 단일 로그/입력에 대해 매우 빠르게 완료되어야합니다. 때로는 CPU 100 %에 도달합니다.

누구든지이 정규식 문제를 해결하는 데 도움이 될 수 있습니까?

감사

답변

8

당신으로 인해 표현 (?:\..*?)*가 일치 할 수있는 방법의 많은 수의 치명적인 되돌아가있다. 잠재적으로 수백만 개의 일치 항목을 검사해야하며 문자열의 점 수와 함께 기하 급수적으로 증가해야합니다. 이 문제를 해결하려면이를 변경할 수 있습니다 이것에

(?:\..*?)*\s+ 

을 : 당신이 등 일부 날짜/시간/찾고있는 것처럼

\..*\s 
+0

이것은 훌륭한 ... 이제 문제를 안다. 고마워요. –

3

것 같습니다. ALER/NOTI 행에 대한 정보. ALER/NOTI를 먼저 grepping하여 해당 행을 구문 분석 할 수 없습니까? 그러면 아마도 흥미로운 행에서 정규 표현식을 실행하는 것이 훨씬 쉬울 것입니다 (정규 표현식을 단순화 할 것입니다).

2

실무 예제를 제공하지 않았기 때문에 느린 이유는 무엇입니까?
(?:\..*?)*입니다. 메타 기간. 리터럴
기간과 일치합니다. 그 표현은 문자적인 기간이 있다면 그것을 얻고 모두를 \ s까지 올리라고 말합니다.
그러나 리터럴 기간은 선택 사항입니다.

(?:\.(?:(?!\s(?:ALER|NOTI)).)*?)?\s+(ALER|NOTI) 

그 자체가 오히려 bizzare입니다. 확장되면 볼 수 있습니다.

(?: 
    \. 
    (?: 
     (?!\s(?:ALER|NOTI)). 
    )*? 
)? 
\s+ 
(ALER|NOTI) 
+0

비 탐욕적 수정 기호를 잊어 버렸습니다 – sln

+0

이것은 훌륭한 대답입니다 ... 이제 문제를 압니다. 정말 고맙습니다.... –