2017-02-13 7 views
1

정규 표현식을 사용하여 GEDCOM 파일을 구문 분석하려고하는데 거의 끝나지만 표현식은 줄의 끝에 선택 텍스트가있는 행에 대해 텍스트의 다음 행을 가져옵니다. 각 레코드는 한 줄이어야합니다. 행 끝의 정규 표현식

는 파일에서 추출입니다 :

0 HEAD 
1 CHAR UTF-8 
1 SOUR Ancestry.com Family Trees 
2 VERS (2010.3) 
2 NAME Ancestry.com Family Trees 
2 CORP Ancestry.com 
1 GEDC 
2 VERS 5.5 
2 FORM LINEAGE-LINKED 
0 @[email protected] INDI 
1 BIRT 

이것은 내가 사용하고있는 정규 표현식이다 :

이에 텍스트를 포함하지 않는 제외한 모든 라인을 작동
(\d+)\s+(@\[email protected])?\s*(\S+)\s+(.*) 

첫 번째 것과 같은 끝. 예를 들어, 첫 번째 레코드의 마지막 캡처 그룹에는 '1 CHAR UTF-8'이 포함됩니다. 여기

는 보라색 캡처 그룹이 다음 줄에 출혈 방법을 보여주는, regex101.com에서 스크린 샷입니다 :. 나는를 제한하기 위해 $ 한정자를 사용하여 시도

Regex101 screen shot

* 그냥 라인 끝 , 두 번째 줄 또한 줄 끝이기 때문에 실패합니다.

도움을 주시면 감사하겠습니다.

데이브

+1

'\ s'는 개행과 일치하거나, ​​정규 공간으로 바꾸거나'[^ \ S \ r \ n]'(PCRE이면'\ h')로 바꾸십시오. https://regex101.com/r/N2ZWWo/1를 참조하십시오 ('^'는 여러 줄 옵션과 함께 추가됩니다). –

+0

Wiktor에게 깊은 감사의 말을 전합니다. 답을 만들고 싶다면 최선을 다할 것입니다. 이것은 트릭을 수행하는 것 같습니다 : (\ d +) + (@ \ S + @)? * (\ S +) * (. *) –

+0

'. *'는 기본적으로 욕심이 많으므로 최대한 일치시킵니다. '. *? $'를 시도해 비 탐욕적인 일치로 만드십시오. – phuzi

답변

1

\s 패턴은 개행 문자와 일치합니다. PCRE 인 경우 [^\S\r\n] 또는 \h 또는 [\p{Zs}\t] 인 경우 일반 공간으로 교체하십시오. 당신이 라인 일치해야하는 경우

(\d+) +(@\[email protected])? *(\S+) +(.*) 

regex demo

를 참조하십시오, 당신은 여러 옵션을 추가 할 수 있으며 (양쪽합니다 (귀갑의 끝에서 시작시 ^$를) 앵커를 추가 another demo 참조).