2012-02-23 2 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です。

/k?user 

1は "?は" 正規表現パターン自体に一致しないため、パターン

^/k\?user\z 

を使用する必要がある(のみ)と一致するように

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

quotemetaを使用してください。 "?"と一致するようにエスケープする必要があります( "\?")。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

関連する問題