2011-05-08 2 views
1

정규식을 사용하여 데이터베이스로 파싱해야하는 텍스트 파일을 골라야했습니다. 내 파일의 형식은 다음과 같습니다여러 캡쳐 그룹이있는 정규 표현식

Lorem ipsum dolor         sit amet, consectetur adipiscing elit. 

Fusce lacinia sollicitudin lectus id eleifend. Phasellus. 

massa sapien, scelerisque in tincidunt et, porttitor eget ante. 
In iaculis justo vel quam rhoncus volutpat. Curabitur eros est, 
ultrices in elementum eget, venenatis eget mauris. Sed sollicitudin, 
nibh sed varius aliquet, neque odio porttitor risus, at sollicitudin 

lectus neque sit amet diam. 
Aliquam condimentum sapien eu 
tellus condimentum suscipit. 
Pellentesque in accumsan nunc. 

나는 다음과 같은 캡처 그룹을 마련하기 위해 노력하고있어 :

  • Lorem ipsum dolor
  • sit amet, consectetur adipiscing elit.
  • Fusce lacinia sollicitudin lectus id eleifend. Phasellus.
  • massa sapien, scelerisque in tincidunt et, porttitor eget ante.
    In iaculis justo vel quam rhoncus volutpat. Curabitur eros est, ultrices in elementum eget, venenatis eget mauris. Sed sollicitudin, nibh sed varius aliquet, neque odio porttitor risus, at sollicitudin

참고 : 여러 줄의 단락 뒤에 나오는 모든 내용은 무시할 수 있습니다. 모든 그룹에는 문자, 숫자, 공백 및 구두점이 포함될 수 있습니다. 필자는 PHP를 사용하여 텍스트에 대한 몇 가지 추가 사후 처리 작업을 수행 할 것입니다.

작동하지 않았다 여전히 내 다른 시도보다 가까운했지만 처음 2 개 부분을 캡처하는 내 마지막 시도 의도 한대로였다 :

^((?:[a-zA-Z0-9!-~](?: (?!))?)+?)(?: {2,})((?:[a-zA-Z0-9!-~](?: (?!))?)+?) 

내가이 파일의 시작 부분에 시작하는 것이라고 생각 , 여러 공간이 발생한 지점까지 모든 것을 캡처 한 다음 나머지 줄을 가져옵니다. 내가 샘플 텍스트에 모든   년대 있으리라 믿고있어

$pattern='~\A(.+?) {2,}(.+?)\R{2,}(.+?)\R{2,}(.+?)(?:\R{2,}|\Z)~s'; 

preg_match($pattern, $subject, $match); 

See it in action on ideone.com

일정한 공간을 나타내며, 당신은 단지 우리가 더 있다는 것을 알 수 있었다을 사용 :

+0

어떤 언어를 사용하고 있습니까? –

+0

나는 모든 것을하기 위해 PHP를 사용하고 있습니다. – Tim

+0

알기 만하면됩니다. 그것은 정규식 질문을 할 때 유용합니다. –

답변

1

이 시도 한 공간보다. SO의 코드 형식을 처음부터 사용했다면 그럴 필요가 없었을 것입니다. 그것은 들여 쓰기 형식화 스타일입니다. 백틱으로 포맷 된 텍스트에서 공백은 여전히 ​​축소됩니다.

전체 파일을 메모리로 읽는 중이며 줄 단위로 처리하지 않는다고 가정합니다. 정규식은 꽤 간단합니다. 텍스트 (\A)의 시작 부분부터 시작하여 두 개 이상의 연속 된 공백 ({2,})이 표시 될 때까지 마지 막으로 일치하는 모든 내용 (단일 행 모드에서 (.+?))을 찾습니다.

그 후, 마지 막으로 두 개 이상의 줄 바꿈이 표시 될 때까지 일치하고 캡처합니다 ((.+?)\R{2,}). 그런 다음 두 번째 및 세 번째 단락을 캡처하기 위해 두 번 더 똑같은 작업을 수행합니다. 마지막 (?:\R{2,}|\Z)은 세 번째 단락 뒤에 더 이상 텍스트가없는 경우를 대비하여 있습니다. \n, \r, \r\n과 몇 가지 다른, 덜 일반적인 것들 : 당신이 익숙하지 않다면

\R은 행 단락의 모든 종류의 속기이다. Perl, PHP (PCRE), Ruby 1.9+ (Oniguruma) 및 몇 가지 다른 기능으로 지원되지만 JavaScript, Python, Java 또는 .NET에서는 지원되지 않습니다.

+0

위의 패턴의 수정 된 버전을 사용했습니다 : 'code' /^(.*?) {2,} . *?) \ t (. *?) \ t (. *?) \ t/s – Tim