• ベストアンサー

正規表現をエスケープさせる関数はあるのでしょうか?\はつけたくないです。

=head Perlの正規表現で例えば aa+aaという文字列をマッチさせたいのですがわざわざ\をいれずに、正規表現をエスケープするような関数? $k = ○○($k); はあるのでしょうか? =cut #my $k = 'aa+aa'; # だとマッチせず my $k = 'aa\+aa'; # だとマッチします。 my $dat = 'aa-aa+aa-aa'; if($dat =~ /($k)/){ print "見つかりました\n"; } print "OK\n"; exit; __END__

  • Perl
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

quotemeta がまさにその関数です。   my $k = quotemeta('aa+aa');     # aa\+aa また、メタ文字 \Q~\E を使っても同様で、~部分に含まれるメタ文字が無効化されて評価されます。   my $k = 'aa+aa';   if ($dat =~ /(\Q$k\E)/) {      # /(aa\+aa)/ を指定したのと同じ。

その他の回答 (1)

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.2

perldoc -f quotemeta してみて下さい。場合によってはこれで間に合うかもしれません。

関連するQ&A

  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl
  • エスケープ文字そのものにマッチさせる正規表現

     お世話になっております。  PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。  文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現について

    いつもお世話になっております。 perlの正規表現で分からない事があります。 ご存知の方がいらっしゃれば、アドバイスを頂けますようよろしくお願い致します。 (質問内容) 以下のようなプログラムを実行した場合、matchが出力されてしまいます。 $aには、「、IS」を設定しているので、「真」と扱われないと思うのですが、何故、matchが出力されるのでしょうか? また、「偽」として処理をいしたい場合、 どのようにすればよろしいのでしょうか? #!/usr/bin/perl $a = "、IS"; $b = "AIS"; if ($a =~ $b){ print "match\n"; } else{ print "not match\n"; }

  • 正規表現ですが・・・

    正規表現なんですが(Perlです。) Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt Bb_abcd.txt 上記のabcdの部分をマッチさせるために (?<=Aa_|Bb_).*(?=_aa|_bb|_cc|\.txt) としてみましたが、これでは Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt のabcd_aaやabcd_bbやabcd_ccとマッチしてしまいます。 なにかよい表現の仕方はありますか? まとめてマッチさせる表現が知りたいです。

  • (?:系の正規表現

    perlの正規表現で以下の意味は、ABC01かABC99のみマッチするということでよいでしょうか? /^ABC(?:01|99)$/ (?:は$1など使用しない場合に用いるで正しいでしょうか? (?系の正規表現について知識不足ですが、一覧や詳しい書籍がありましたら教えてください。 昔、 /^ABC01|99$/ とかいて、ABC99がマッチせず、99がマッチしたので、|を使うときは、()を書いたのですが$1など変に作用させたくなかったので、最近(?:系の存在を知ってもっと詳しく知りたくなりました。 (?:はPerlの正規表現特有のものでしょうか?

    • ベストアンサー
    • Perl
  • 正規表現メタ文字「-」のエスケープ(再質問)

    いつもお世話になります。 以前に質問しているのですが、私の質問内容が悪かったため、再度質問をあげさせていただきます。 正規表現のメタ文字のエスケープ処理を行いたいのですが、「-」の記号について、「[」「]」の中に出てきたときのみ([a-z]、[0-9]など)、 一括でエスケープしてくれるような正規表現は何を指定すればよいでしょうか。 例えば、以下の文字列があった場合、 ああaa-bb[0-9]いいい-uuu[a-zA-Z] エスケープ処理された結果、以下のようになる。([]内の-のみエスケープ処理されて、「\-」となっている) ああaa-bb[0\-9]いいい-uuu[a\-zA\-Z] 上記の一括エスケープ処理を行ってくれる正規表現は、何を指定すればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • URL\正規表現@java

    perlメモさん?にPerlでのURLの正規表現はあるのですが Javaで使いたいと思います。 Pattern pattern = Pattern.compile("正規表現"); Matcher matcher = pattern.matcher(String); のステートメントを使う方法をご存知な方おられませんか? Perlメモさん?の正規表現をエディタにコピペしても 不正なエスケープエラー?がでてだめでした。 (http Urlのごちゃごちゃした奴の下から二番目) (「\b(?:」で始まる奴です) なのでエディタに貼り付けて\を\\に置き換えたものを 正規表現の部分にしたところコンパイルはとおりましたが、 正確にマッチしてくれませんでした。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 正規表現の質問です。

    実行環境がなく困っています・・ Perlで以下の正規表現はマッチするでしょうか? if("EUC-JP" =~ m|EUC|i ) { print "match"; }

    • ベストアンサー
    • Perl
  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • 正規表現教えてください。

    正規表現を教えてください。 YYYYMMDD_aa._aa_bbb.txt とあったとき YYYYMMDDは日付をあらわし, aa._aaはサーバ名をあらわして bbb.txtはファイル名をあらわすとき YYYYMMDD aa._aa bbb 値は変化するものでYYYYMMDD_サーバ名_fail.txtは変わらないとした時 それぞれをあらわすperlでの正規表現を教えてください。 まとめてあらわすのではなく、ひとつずつを表す方法でお願いします。

専門家に質問してみよう