2011-03-25 2 views
4

URL 문자열 목록 내에서 일치해야하는 하위 문자열 목록이 있습니다. 하위 문자열에는 '|', '*', '-', '+'등의 특수 문자가 있습니다. URL 문자열에 하위 문자열이 포함되어 있으면 일부 작업을 수행해야합니다. 하지만 지금은 콘솔에 "TRUE"라고 인쇄 할 것입니다.특수 문자가있는 문자열의 Perl 정규 표현식

나는 하위 문자열 목록에서 먼저 읽은 다음 해시에 넣음으로써이 작업을 수행했습니다. 그런 다음 일치하는 항목이 발견 될 때까지 각 URL에 대해 전체 목록의 간단한 Regexp 일치를 수행하려고했습니다. 코드는 다음과 같습니다.

open my $ADS, '<', $ad_file or die "can't open $ad_file"; 

while(<$ADS>) { 
     chomp; 

     $ads_list_hash{$lines} = $_; 
     $lines ++; 
} 

close $ADS; 

open my $IN, '<', $inputfile or die "can't open $inputfile";  
my $first_line = <$IN>; 

while(<$IN>) {  
     chomp;  

     my @hhfile = split /,/;  
     for my $count (0 .. $lines) { 

      if($hhfile[9] =~ /$ads_list_hash{$count}/) { 
       print "$hhfile[9]\t$ads_list_hash{$count}\n"; 

       print "TRUE !\n"; 
       last; 
      } 
     } 

} 

close $IN; 

문제는 문자열 경기 $hhfile[9] =~ /$ads_list_hash{$count}/에 오류를 일으키는 특수 문자를 많이 가지고있다. 몇 가지 예가 있습니다.

+adverts/ 
.to/ad.php| 
/addyn|*|adtech; 

나는 기본적으로 밝히는이 같은 라인에 오류가 "한정 기호는 정규 표현식에서 아무것도 다음과 없습니다"얻을. 이들을 피하기 위해 정규 표현식 매칭 구문에서 무엇인가 chanhge해야합니까?

+1

그냥 문자열을 찾기 위해 노력하는 경우, 다음 정규식 ... 이유가 거기에 과잉 조금 보인다 이유 [인덱스 ] (http://perldoc.perl.org/functions/index.html)는 필요한 것을하지 못합니까? – jswolf19

+0

가능한 중복 [Perl 정규 표현식에서 특수 문자를 처리하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

답변

13

문자열의 특수 문자를 이스케이프 처리해야합니다. 일을 할 것입니다 \Q\E 사이의 문자열을 묶는

:

if($hhfile[9] =~ /\Q$ads_list_hash{$count}\E/) { 
+0

'perldoc -f quotemeta'도 참조하십시오. – shawnhcorey