2014-11-18 3 views
4

perl에서 이상한 동작이 발생합니다. "Beginning"에 일치하는 정규 표현식 ($ reg)이 주어지면 "1"또는 "2"그리고 "End"는 "1 \ n"과 일치합니다 - 왜?개행 문자가 포함되어 있지만 일치하지 않는 경우 정규식이 일치합니다.

my $reg='^[1-2]$'; 
my $x="1\n"; 
if ($x =~ m/$reg/) { 
    print "matches"; 
} else { 
    print "doesn't match"; 
} 

$ x에 두 개의 개행을 사용하면 더 이상 일치하지 않습니다. 위 코드와 일치하지 않는 코드를 찾고 있습니다. "1"또는 "2"가 $ x에있을 때만 참이어야합니다. RegEx 만 허용됩니다 - chomp 또는 기타 비교/대체가 없습니다.

답변

5

$은 줄 바꿈 옵션과 일치합니다. http://perldoc.perl.org/perlre.html

$  Match the end of the string (or before newline at the end 
     of the string) 

그래도 이중 줄 바꿈 일치하지 않습니다.

당신은 아마 원하는 :

my $reg='\A[1-2]\z'; 

어느 것 :

\A Match only at beginning of string 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 

편집 : mpapec로 의견에서 언급 한 바와 같이 :

당신이 일치하고 정적 패턴을 가지고 감안할 때 잠재적으로 여러 번 - 인터프리터가 검사 할 때마다 정규 표현식을 컴파일하므로 불필요한 작업을 수행합니다.

이 처리를 저장하는 qr을 사용하여 정적 패턴을 컴파일 할 수 있습니다.

http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

같은 패턴을 많이 (이 복잡한 패턴의 경우 특히) 테스트를하는 경우에 특히 적용의
my $reg = qr/\A[12]\z/; 

if ($x =~ $reg) { 
    #... 
} 

.

+0

Ahh. 그게 전부 야. 고마워요! – int2000

+1

+1, qr // 컴파일 된 정규식을 언급 할 가치가 있습니다. –

0

^[1-2]$'$ (줄 앵커의 끝)이 \n 문자 앞에 일치하기 때문에 1\n과 일치합니다.

+0

그것을 해결하지 못했습니다 : http://ideone.com/AUlZo5 – int2000

+0

그것은 수직 공간을 일치하지 않는 옳은 일을합니다. 즉, 수직 공간 ('\ r' 또는'\ f')을 고려하지 않습니다. –

관련 문제