重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

|(パイプ)以外をエスケープしてマッチしているか判定をさせたいのですが、スマートな方法をご教授して頂けないでしょうか?

下記は、自分で作ってみたものですが、イマイチなので・・・

それと「?」「*」「+」「|」以外でも\Qでエスケープされない文字ってあるのでしょうか?


#!/usr/bin/perl

print "Content-type: text/html\n\n";
print<<"end";
<HTML><BODY>
end
$a = "http://www.excite.co.jp/index.html?12";
$b = "index.html?12";
$c = $a;
$c =~ s/\?/<-hatena->/g;
$c =~ s/\*/<-asuta->/g;
$c =~ s/\+/<-plus->/g;
$d=$b;
$d =~ s/\?/<-hatena->/g;
$d =~ s/\*/<-asuta->/g;
$d =~ s/\+/<-plus->/g;
if($c=~ m/$d/i){$match_j="ok";}

print<<"end";
a: $a<br>
b: $b<br>
c: $c<br>
d: $d
<br>($c=~ /\Q$d\E/i)
<br>match:$match_j
</BODY></HTML>
end

A 回答 (1件)

> |(パイプ)以外をエスケープしてマッチしているか判定をさせたい



正規表現用のエスケープ関数 quotemeta を使ってエスケープした後、| だけアンエスケープした文字列を使えばよいでしょう。

$d = quotemeta($b);
$d =~ s/\\\|/|/g;
if ($a =~ /$d/i) { $match_j = "ok" }

または | 区切りで分割し、それぞれの文字列をエスケープした後、| で連結するというのもありです。

$d = join '|', map quotemeta, split /\|/, $b;
if ($a =~ /$d/i) { $match_j = "ok" }

※共に $a は加工する必要がないので、$c は不要です。

> 「?」「*」「+」「|」以外でも\Qでエスケープされない文字ってあるのでしょうか?

「されない」ではなく「される」文字では?それらの文字は全てエスケープされますよ?
\Q や quotemeta でエスケープされないのは、\w にマッチする文字だけです。その他(\W にマッチする文字)は全てエスケープされます。
    • good
    • 0
この回答へのお礼

leaz024さん、回答ありがとうございました。
$d = quotemeta($b);
$d =~ s/\\\|/|/g;
if ($a =~ /$d/i) { $match_j = "ok" }
まさに私のやりたかったことです。
助かりました。
ありがとうございます。

お礼日時:2005/06/12 09:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!