2012-02-23 4 views
-1

누군가 여기서 내게 어떤 일이 일어 났는지 설명 할 수 있습니까? 그리고 그 해결 방법은 무엇입니까 ??동일한 텍스트와 일치하지 않는 변수가있는 Perl 정규식

my $test1 = "/k?user"; 
my $test2 = "/k?user"; 
if ($test1 =~ m/$test2/) { 
    print "match"; 
} 
else { 
    print "fail"; 
} 

인쇄물이 매번 "실패"합니다. 내가 $test1$test1"/k?"으로 변경하면 일치가 작동합니까?

분명히 다음과 같은 텍스트와 관련이 있습니다. 하지만 일치시키려는 변수에는 물음표가 있고, 모든 것을 따로 따로 모아 조각을 일치시킨 다음 모든 것을 재구성하지 않아도됩니다.

어떤 아이디어 ???

답변

4

?special character in a regex입니다. quotemeta 사용 (전용) 일치

my $test1 = "/k?user"; 
my $test2 = quotemeta "/k?user"; 
if ($test1 =~ m/$test2/) { 
    print "match"; 
} 
else { 
    print "fail"; 
} 
+1

이 빠르고 간단하게 답변을 주셔서 감사합니다! – msikd65

+0

또한 "un"-quotemeta하는 방법이 있습니까? 메타 문자를 쉽게 탈출 할 수있는 방법은 무엇입니까? – msikd65

+0

잘 모르겠습니다. 따옴표로 묶지 않은 문자열을 스칼라에 저장 한 다음 다른 스칼라로 따옴표를 저장할 수 있다고 생각합니다. – toolic

2

/k?user 

하나가 "?는"정규식 패턴에 자신을 일치하지 않는

^/k\?user\z 

때문에 패턴을 사용해야합니다. "?"과 일치하도록 문자를 이스케이프 ("\?"사용)하고 quotemeta을 사용하여 특수 문자 (예 : "?")를 이스케이프 처리해야합니다.

my $str = '/k?user'; 
my $pat = quotemeta($str); 
/^$pat\z/ 

quotemeta은 이중 인용 문자열 리터럴 및 정규식 패턴 리터럴에 \Q..\E을 통해 액세스 할 수 있습니다.

my $str = '/k?user'; 
/^\Q$str\E\z/ 

(이전 toolic 제안이 솔루션은 또한 "!/k?userf"를 일치합니다.)

+0

\ Q ... \ E는 오히려 도움이됩니다. 아마도'quotemeta'보다 더 많을 것입니다. 그가 "?"은 내 무지의 원천이었던 정규 표현식의 특수 문자 인 것을 지적했기 때문에 툴 메딕에 "받아 들여진 대답"을 주어야 할 것이다. – msikd65

+0

나는 그것도 특수 문자라고 언급했지만, 나는 할 수있다. 당신이 원한다면 더 명시 적이어야한다. – ikegami

관련 문제