2011-01-12 4 views
1

단지 1 도메인에 맞게 :펄 정규식 내가 다음과 일치하는 정규식을 만들려고 해요

[email protected]

PART1 : PART1는 5 자리 숫자는 어디에서 0-9
2 부 : [선택] 여기서 @ domain.com을 제외한 모든 도메인은 @ yahoo.com

예 : [email protected]
은 내가 conditiona을 삽입하는 방법을 찾을 수 아니에요 난 정규식에. 이제 정규 표현식 만 숫자와 도메인을 일치시킵니다. 아직 파악해야합니다

#!/usr/bin/perl 
use strict; 
use warnings; 

my $regex1 = '^(\d{5})([@]([a-zA-Z0-9_-]+?\.[a-zA-Z]{2,6})+?)'; 

while (my $line = <DATA>) { 
    chomp $line; 
    if ($line =~ /$regex1/) 
    { 
    print "MATCH FOR:\t$line \n"; 
    } 
} 

샘플 :

  1. 방법 @ yahoo.com

코드를 제외한 모든 도메인을 받아 들일

  • 조건의 숫자 만 일치 데이터 :

    1234 
    [email protected] 
    [email protected] 
    [email protected] 
    12345 
    [email protected] 
    [email protected] 
    [email protected] 
    [email protected] 
    
  • +0

    이것은 정규식을 사용하지 않고도 해결할 수있는 문제처럼 보입니다. 나는 당신이이 길을 가고있는 이유에 대해 궁금합니다. (내가 정규 표현식이 아니거나 로켓 발사기로 쥐를 죽이는 것처럼 보이지는 않습니다) – Terrance

    답변

    2

    이유는 단순히 처음 yahoo.com 확인하지 당신이 얻는 경우에 일치는 다음 라인으로 이동 :이 방법에 대해

    while (my $line = <DATA>) { 
        chomp $line; 
        next if ($line =~ /yahoo\.com$/); 
        if ($line =~ /$regex1/) 
        { 
        print "MATCH FOR:\t$line \n"; 
        } 
    } 
    
    2

    ? 확장 된 형태에서

    \d{5}(?:@(?!yahoo)[a-zA-Z0-9.]+\.[a-zA-Z]{2,3})? 
    

    :

    \d{5}   # 5 digits 
    (?:    # begin a grouping 
        @    # literal @ symbol 
        (?!yahoo\.com) # don't allow something that matches 'yahoo.com' to match here 
        [a-zA-Z0-9.]+ # one or more alphanumerics and periods 
        \.    # a literal period 
        [a-zA-Z]{2,3} # 2-3 letters 
    )    # end grouping 
    ?    # make the previous item (the group) optional 
    

    (?!yahoo\.com)는 "negative lookahead assertion를"라고하는 것이다.