2012-02-23 32 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 2012-02-23 22:20:54

+0

也有沒有辦法「un」--quotemeta?一種快速的方式來解除元字符的解鎖? – msikd65 2012-02-23 22:38:04

+0

我不知道。我想你可以將未加引號的字符串存儲爲標量,然後用另一個標量引用。 – toolic 2012-02-23 22:40:35

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 2012-02-23 22:57:08

+0

我確實提到它也是一個特殊字符,但我可以如果你想要更明確。 – ikegami 2012-02-23 23:05:02