2011-04-12 3 views
0

텍스트 일치를 반복하고 싶습니다. 일치하려는 블록은 숫자부터 시작하여 탭 문자로 시작합니다.정규식 - 다음 일치까지 일치

내 시합 경기는 ^\d+\t입니다.하지만 다음 경기 전까지이 경기를 포함하여 모든 텍스트를 원한다는 것을 나타내는 방법이 있습니까?

입력 데이터 : 나는 펄을 사용하고

1  111.111.111.111 
111.111.111.111 
        Host IP  111.111.111.111 
111.111.111.111 
111.111.111.111   Host IP  TCP    app  11111, 11111, 11111, 11111  Allow 
2  111.111.111.111 
111.111.111.111 
111.111.111.111   Host IP  111.111.111.111 
111.111.111.111   Host IP  TCP    app  11111, 11111, 11111, 11111  Allow 
3  111.111.111.111 
111.111.111.111   Host IP  111.111.111.111 
111.111.111.111 
111.111.111.111 
111.111.111.111   Host IP  TCP    app  11111, 11111, 11111, 11111  Allow 
4  111.111.111.111 
111.111.111.111 
111.111.111.111 
111.111.111.111   Host IP  111.111.111.111 
111.111.111.111   Host IP  TCP    app  11111, 11111, 11111, 11111  Allow 

.

+0

텍스트 구문 분석하려고합니다. http://pastebin.com/rfP8ftsh – mphuie

답변

1

다음 정규식은 당신이 원하는 일을해야합니다

^\d+\t(?:[^\d]+|[\d]+(?!\t))* 

이 탭으로 다음 숫자 몇 개의 다음 탭 다음에 포함되지 않은 비 숫자 또는 숫자의 수와 일치합니다.

my @matches = $data =~ /^\d+\t(?:[^\d]+|[\d]+(?!\t))*/mg; 

편집 : 좋아,이 하나가 작동합니다!

+0

시도해 본 결과 전체 블록이 하나부터 끝까지 일치합니다. 여기에 텍스트 : http://pastebin.com/rfP8ftsh – mphuie

+0

@mphuie : 최신 편집이 작동해야합니다. 이전 편집은 문자열이 숫자로 끝나면 작동하는지 확인하려고했을 때 깨졌습니다. –

0

아마도이 부분이 맞습니까?

/^\d+\t.*?(?:\z|^\d+\t)/ms 
0
while (/ 
    \G 
    (\d+\t) 
    ((?: (?! \d+\t) .)*) 
/xg) { 
    print("match: $1\n"); 
    print("buffer: $2\n"); 
} 
0

샘플 입력은 내가 당신을 위해 무엇을 찾고 내가 아는 정말 모르겠어요대로 결과가 도움이 될 것으로 예상. 당신은 단지 하나 개의 패턴에 일치하는 경우

당신은 문자열을 분할 할 수 있습니다

my $string = "text\n1\ttest\n2\tend\n"; 
my @matches = split /^(\d+)\t/m, $string; 
shift @matches; # remove the text before the first number 
print "[$_]\n" for @matches; 

__END__ 
Output: 
[1] 
[test 
] 
[2] 
[end 
] 

당신의 펄 당신이 경기 시작과 마감 곳을 찾을 수 있습니다 특별한 변수가 여러 패턴과 일치하는 경우. 두 경기 사이에 있었던 것을 추출하는 데 사용할 수 있습니다.

use English qw(-no_match_vars); 

my $string = "1\ttestEND\n2\ttextEND\n"; 
if ($string =~ /^\d+\t/) { 
    my $last_match_end = $LAST_MATCH_END[0]; 

    if ($string =~ /END/cg) { 
     my $last_match_start = $LAST_MATCH_START[0]; 
     my $len = $last_match_start - $last_match_end; 
     print substr($string, $last_match_end, $len) . "\n" 
    } 
} 
__END__ 
Output: 
test