2009-02-23 17 views
7

私はPerlプログラムを使ってファイルからテキストを抽出しています。私は例えば、私は、テキストの区切り文字として使用する文字列の配列を持っている:Perl正規表現で特殊文字を処理するにはどうすればよいですか?

$pat = $arr[1] . '(.*?)' . $arr[2]; 

if ($src =~ /$pat/) { 
    print $1; 
} 

しかし、配列内の文字列の二つが​​と(Buy now)です。これらの問題は、文字列のシンボルがPerl正規表現のend-of-stringとcaptureグループを表しているため、テキストが意図したとおりに解析されないことです。

方法はありますか?

答えて

11

Perlのquotemeta機能を試してください。あるいは、正規表現で\Q\Eを使用して、正規表現の値の補間を無効にすることもできます。 \Q\Eについては、perlretutをご覧ください。お探しのものと異なる場合があります。

+0

特に、\ Qはバックスラッシュエスケープ文字から保護しません。 quotemetaははるかに一般的な解決策です。 –

+2

@BenBlank:どういうことですか? '\ Q' *は' quotemeta'にコンパイルされます。それらは同じ機能です。同様に '\ L'は' lc'、 '\ U'を' uc'などにコンパイルします。 '\ Q'はバックスラッシュエスケープ文字を完全にうまく保護します。 ** – tchrist

4

使用quotemeta:彼らはリテラルとして解釈されているので、メタ文字をエスケープするquotemeta

$pat = quotemeta($arr[1]).'(.*?)'.quotemeta($arr[2]); 
if($src=~$pat) print $1; 
9

$pat = quotemeta($arr[1]).'(.*?)'.quotemeta($arr[2]); 
if($src=~$pat) { print $1 } 

または

$pat = "\Q$arr[1]\E(.*?)\Q$arr[2]"; # \E not necessary at the end 
if($src=~$pat) { print $1 } 

か、単に

if ($src =~ /\Q$arr[1]\E(.*?)\Q$arr[2]/) { print $1 } 
:ショートカットとして、あなたが引用されるべきものを囲むように二重quotish文脈で\ Q ... \ Eを使用することができます

これは補間された変数に限定されないことに注意してください。明らかにそれは変数展開後に発生

perl -wle'print "\Q.+?"' 
\.\+\? 

ものの、その "\ Qは$ fooが" '\の$ fooの' なりません:リテラル文字はあまりにも影響を受けます。

関連する問題