2016-06-22 7 views
1

나는 다음과 같은 로그가 내가 올바르게 구문 분석하기 위해 노력하고 있습니다(regex) 하나의 이벤트 로그에 5 개의 필드가 있고 다른 하나에는 6이 들어 있으면 대괄호로 묶인 모든 데이터를 어떻게 캡처합니까?

[groupA] [groupB] [groupC] [groupD] [groupE] messsage 
이벤트의 일부는 5 개 괄호 필드와 1 메시지 및 로그의 다른 세트가

[groupA] [groupB] [groupC] [groupD] [groupE] [groupF] messsage

6 개 괄호 필드와 1을 포함 메시지.

대괄호 안의 각 필드를 어떻게 캡처 (및 이름 지정)합니까? 내가 처음 레이아웃을 캡처 다음 정규식을 한 후 나는 할 수는 OR (|) 두 번째 레이아웃 캡처 :

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s(?<message>.*)|\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s\[(?<E>.+?)\]\s(?<message>.*) 

답변

0

당신은 다음과 같은 옵션 그룹을 사용할 수 있습니다

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\] 
    \s\[(?<A>.+?)] 
    \s\[(?<B>.+?)] 
    \s\[(?<C>.+?)] 
    \s\[(?<D>.+?)] 
    (?:\s\[(?<E>.+?)])? # HERE 
\s(?<message>.*) 

보기를 regex demo (복수 라인 데모에서 을 사용하여 \s과 일치하는 \n 제외).

빈 값을 허용하려면 .+?.*?으로 바꾸십시오. [...]의 값에 ] 또는 [이 없으면 \[(.+?)]을 모두 \[([^][]*)]으로 바꾸는 것이 좋습니다.

+0

고맙습니다. 나는 선택 그룹을 사용한 적이 없다. – user3002

0

이 정규식은 사용자 상황에 맞는 것으로 보입니다. 필자는 pcre와 두 개의 샘플 입력으로 테스트 해 보았습니다.

/\[([a-zA-Z]+)+\]|([a-zA-Z]+)/g