2011-03-03 4 views
7

정규식을 사용하여 구문 분석해야하는 텍스트 파일이 있습니다. 내가 캡처해야 텍스트는 다음과 같이 여러 그룹에 있습니다 :이 "블록"에, 다음 7 개 lines.In 즉 다음에 트럭을 캡처해야이 예를 들어자바에서 정규식을 사용하여 여러 줄 패턴을 캡처하는 방법은 무엇입니까?

truck 
zDoug 
Doug's house 
(123) 456-7890 
[email protected] 
30 
61234.56 
8/10/2003 

vehicle 
eRob 
Rob's house 
(987) 654-3210 
[email protected] 

내가 8 개 그룹이있다. 이것은 내가 무엇을 시도했다 그러나 그것은 다음 줄 캡처하지 않습니다 :

(truck)\n(\w). 

참고 : 나는 자바 I 포트를하기 전에 내 정규식을 테스트하는 프로그램 RegExr을 사용하고 있습니다.

+2

일을해야합니까? –

+0

@nikita 새 줄을 포함하는 그룹을 만들고 싶기 때문에 – lampShade

답변

5
(?m)^truck(?:(?:\r\n|[\r\n]).+$)* 

이 전체 텍스트를 가정처럼, DOTALL 모드에서 뭔가를 컴파일해야한다고 생각 즉, 당신 파일을 한 줄씩 읽지 않는 경우), 이 코드와 같이 줄 구분 기호가 항상 \n 인 것으로 가정합니다. 최소한 \r\n\r을 허용해야합니다. 이는 (?:\r\n|[\r\n])입니다. 그러나 여전히 중 하나만 구분 기호와 일치하므로 블록 끝에있는 이중선 구분 기호 앞에 일치가 중지됩니다.

데이터 블록을 찾으면 줄 구분 기호로 분할하여 개별 줄을 가져올 수 있습니다. 다음은 예입니다 :

Pattern p0 = Pattern.compile("(?m)^truck(?:(?:\r\n|[\r\n]).+$)*"); 
Matcher m = p0.matcher(data); 
while (m.find()) 
{ 
    String fullMatch = m.group(); 
    int n = 0; 
    for (String s : fullMatch.split("\r\n|[\r\n]")) 
    { 
    System.out.printf("line %d: %s%n", n++, s); 
    } 
} 

출력 : 나는 또한 데이터의 각 라인을 믿고있어

line 0: truck 
line 1: zDoug 
line 2: Doug's house 
line 3: (123) 456-7890 
line 4: [email protected] 
line 5: 30 
line 6: 61234.56 
line 7: 8/10/2003

적어도 하나의 문자가 포함되는 경우, 데이터 블록 사이의 빈 줄은 정말 빈 없음을 - 즉, 공백 , TAB 또는 기타 보이지 않는 문자.

(BTW :. (?m)를 제거하고 대신 RegExr이 액션에 의해 구동 multiline 확인란을 선택하기 때문에 규칙이 조금 다른, RegExr에서 그 정규식을 테스트하는 자바 -powered 정규식 테스터를 들어, 체크 아웃. RegexPlanet.) 당신이 라인으로 입력 라인을 읽어해야하는 경우

+0

대단한 답변 Alan 감사합니다! – lampShade

+0

좋은 답변입니다. 정말 감사. 정규식은 너무 강력합니다 – lampShade

3

나는 여러 줄에 걸쳐하기 위해 사용자의 패턴이 (단일 문자열로 읽은

Pattern p = Pattern.compile("truck\\n(.*\\n){7}", Pattern.DOTALL); 
+0

이 정규식은 * DOTALL 플래그없이 * 수정하는 데 더 가까울 것입니다. 그대로,'. *'는 처음에는 문서의 나머지 부분을 모두 소비합니다. 그런 다음 조금 뒤로 되돌아 올 수도 있지만 마지막 줄 넘김까지 모든 항목이 계속 일치합니다. –

+0

아, 탐욕! :-) 놓친 "?" 맨 마지막에 ... 지적 해 주셔서 고마워요! – mazaneicha

+0

한정 기호를 욕심 많은 것으로 만들 필요가 없습니다. 'DOTALL' 플래그를 제거하면 도트는 더 이상 개행과 일치하지 않습니다. –

3

이 패턴은 정규식과 관련이있다 무엇 ((.*|\n)*)

+0

이것은 작동합니다! 고맙습니다! –

관련 문제