• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:パイプ以外をエスケープしてマッチ判定させる方法)

パイプ以外をエスケープしてマッチ判定させる方法

このQ&Aのポイント
  • |(パイプ)以外をエスケープしてマッチしているか判定をさせたいのですが、スマートな方法をご教授して頂けないでしょうか?
  • 「?」「*」「+」「|」以外でも\Qでエスケープされない文字ってあるのでしょうか?
  • Perlのコードを使用して、指定した文字以外をエスケープしてマッチ判定させる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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 にマッチする文字)は全てエスケープされます。

meikenpochi
質問者

お礼

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