2013-02-18 3 views
0

를 예상대로 일치하지 않습니다정규식 나는 다음과 같은 코드를 실행하고

#!/usr/bin/perl -w 

my $filter1="^p1c|^p2c|^p3c|^p11c|^p23c|^p105csi1m1|^p105csi1m2|^p105csi1m13|^p105csi2m14|^p101csi1m1|^p101csi1m2|^p101csi1m13|^p101csi2m14|^p103csi1m1|^p103csi1m2|^p103csi1m13|^p103csi2m16|^p102csi1m1|^p102csi1m2|^p102csi1m13|^p102csi2m16|^p100csi1m4|^p100csi1m5|^p100csi2m13|^p100csi1m14"; 
my $filter2="^p105csi2m13|^p105csi1m14"; 

$n1="p105csi1m14"; 

my $m1 .= "$n1 " if($n1 =~ m/$filter1/); 
my $m2 .= "$n1 " if($n1 =~ m/$filter2/); 

print "\nmatch 1 => $m1\n"; 
print "\nmatch 2 => $m2\n"; 

코드 위의 출력은 다음과 같다 :

match 1 => p105csi1m14 

match 2 => p105csi1m14 

예상되는 결과는 다음과 같다 :

match 1 => 

match 2 => p105csi1m14 

왜 그런 식으로 행동하는지 잘 모르겠습니다. 누군가 위의 문제를 해결하도록 도울 수 있습니까?

+2

'p105csi1m1'은'p105csi1m14'의 부분 문자열입니다. –

+0

'^ p105csi1m1' 정규 표현식은 당신의 문자열과 일치합니다. 정규식 끝 부분에'$ '를 쓰려고 했습니까? – geoffspear

+0

아 ... 도움이 ... 너무 감사합니다. – user2083779

답변

1

p105csi1m1로 시작하므로 일치합니다. 해당 기준은 귀하가 제공 한 두 필터 모두에 나타납니다.

4

일치 항목의 끝을 정의하지 않고 p105csi1m1p105csi1m14의 부분 문자열입니다.

해결 방법은 행의 끝을 나타내는 $을 정규식에 추가하는 것입니다. 또한 그룹을 사용하면 더 쉽게 읽을 수 있고 ^$ 문자를 많이 절약 할 수 있습니다.

my $filter1="^(p1c|...|p105csi1m1)$"; 
my $filter2="^(p105csi2m13|p105csi1m14)$"; 
1

당신은 혼자 힘겨운 일을하고 있습니다. 정규식은 문자열 시작 부분에만 고정되어 있기 때문에 필요한 것보다 더 많이 일치합니다. 부분 일치를 피하려면 마지막에 앵커를 고정해야합니다. 이 비록

my @words = qw(p1c p2c p3c p11c p23c p105csi1m1 p105csi1m2 p105csi1m13 
       p105csi2m14 p101csi1m1 p101csi1m2 p101csi1m13 p101csi2m14 
       p103csi1m1 p103csi1m2 p103csi1m13 p103csi2m16 p102csi1m1 
       p102csi1m2 p102csi1m13 p102csi2m16 p100csi1m4 p100csi1m5 
       p100csi2m13 p100csi1m14); 
my $filter1 = '^(?:' . join('|', @words) . ')$'; 

아마 더 나은 해시 조회로 해결된다 : 또한, 당신은 간단하게 할 수 반복 많은 텍스트가 해시 키가 정확히 일치

my %lookup = map { $_ => 1 } @words; # create a key for each word 
my $m1 .= "$n1 " if($lookup{$n1});  # check if key exists 

주 그래서 당신은하지 않습니다 regexes와 함께 제공되는 유연성을 가지고 있습니다. 하지만이 경우에는 좋은 것 같습니다.

관련 문제