• ベストアンサー

perlにおける正規表現で、パターンに変数を使う場合について教えてください。

変数と変数を正規表現にて比較する場合に、 if ($text =~ /$pattern/) { ... } とすると、「$pattern」を変数として認識しません。 「$」が位置指定子として認識されている?ようです。 「$pattern」を変数として認識させるにはどのようにすればよいのでしょうか? 「\$pattern」のように「\(バックスラッシュ)」を入れても認識されませんでした。

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

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

裏技っぽいんですが, if ($text =~ $pattern) { ... } でよかったりして. あとで見たときに困りそうですが.

DynamisH
質問者

お礼

回答ありがとうございます。 もう疲れ果てて家に帰ってきてしまいました(笑) 明日出勤したら早速ためしてみます!

DynamisH
質問者

補足

お礼と補足が逆になってしまいましたが、 if ($text =~ $pattern) { ... }でいけました! 本当にありがとうございます! 補足としては$patternがファイルから読み込んだ文字列であり、 改行コードが含まれていたため比較してもひっかからなかったというのもありました。 ($patternに文字列を入れた後、改行コードを削除したら大丈夫でした。)

その他の回答 (1)

回答No.1

>「$pattern」を変数として認識させるにはどのようにすればよいのでしょうか? if ($text =~ /$pattern/) { ... } で大丈夫ですよ。 ただし、$pattern に「\」などの記号を入れる場合は、注意が必要です。例えば、 if ($text =~ /\s+/) { ... } としたい場合は、 $pattern = "\\s+"; # \が2つ必要 if ($text =~ /$pattern/) { ... } としなければなりません。 上の問題ではないときは、うまくいかない$textと$patternの情報を提示いただければ、何かわかるかもしれません。

DynamisH
質問者

お礼

回答ありがとうございます。 すみません。もう自宅に帰ってきてしまったので、 詳細の情報はすぐには書けませんが、 あるテキストファイルから1行ずつ読み込み、 $patternに格納した後、それが$text内に含まれるかをチェックしようとしています。 ($patternに格納するものには「\」などのエスケープが必要な文字はありません) EOFまで読み込むため、ループにて制御し、 変数による比較を行わなければならないのですが、 変数を使う>$を頭につける>認識しない!という感じだと思っているのですが、他に理由などあるのでしょうか。 少ない情報で申し訳ありません。

DynamisH
質問者

補足

回答ありがとうございます。 上下いれかわってますが・・・ $patternがファイルから読み込んだ文字列であり、 改行コードが含まれていたため比較してもひっかからなかったようです。 さらにTacosanの //を使わない業を使用したら$patternが文字列として認識されました。

関連するQ&A

  • 正規表現のパターンに変数を指定したい

    perlでパターンマッチを行う際、正規表現で行いますが、パターン文字列内に変数を指定したい場合はどうすればよいのでしょうか? if ($ENV{HTTP_USER_AGENT} =~ /$pattern/) {  : } というようなことをしたいのですが、うまくいきません。 方法はありますでしょうか?

    • ベストアンサー
    • Perl
  • 正規表現でパターン部分を変数処理できますか?

    正規表現でパターン部分を変数にできるのでしょうか? $source = qq{*** テスト ***}; $pattern = qq{テスト}; if($source =~ /$pattern/g){ print "match"; }

    • ベストアンサー
    • Perl
  • 正規表現のパターンマッチがうまくいきません。

    正規表現のパターンマッチがうまくいきません。 入力した文字を含むデータを抽出しようとしているのですが、エラーは出ないものの、ヒットしません。 次の構文をそれぞれを試してみました。 目的は入力された文字$matchを含む$textを@queryに入れることです。 if($text =~ /$match/){ push(@query, $text); } if($text =~ /\$match/){ push(@query, $text); } if($text =~ /.*\$match.*/){ push(@query, $text); } if($text =~ m/.*\$match.*/){ push(@query, $text); } 半角英数で何度か試したのですが、どれでやってもヒットしてくれません。 どこをどのように訂正すればいいでしょうか。 お分かりの方ぜひご指導ください。 ちなみによく入力データを$in{aaa}とか$QUERY{aaa}などとまとめることがあるのですが、これを正規表現にそのまま入れるにはどうしたらいいでしょうか。 {}は量指定子になるのでこのままではエラーになるかなとも思うのですが、\などでエスケープすればいいのでしょうか。 上の$matchも元々は$in{aaa}なのですが、 $match = $in{aaa} として変えています。

    • ベストアンサー
    • Perl
  • Rubyの変数を含んだ正規表現について

    下のように正規表現でlineと 1=,2=などから始まる行を抽出する プログラムですが、どうやら正規表現の左辺(//の中身) には変数は使えないようです。iが文字として 認識されているようです。 解決策を教えてください。 while line = io.gets  20.times{ |i|   if /^i=(.*)/ =~ line   p $1  } end

  • 正規表現

    正規表現のパターンを変数内に入れて評価することは 可能なんでしょうか? たとえば、 my $value = " 0123"; my $patern = "\s.+"; if( $value =~ /$patern/ ) ~略~ のような感じです。

    • ベストアンサー
    • Perl
  • 正規表現内での変数の扱いに関して

    正規表現内での変数の扱いに関して あるの変数の文字列が別の変数の文字列を冒頭に含むかどうか判別した上でその差分を抽出するコードを書こうとしています。 $a='komekoron'; $b='kome'; if($a=~/^$b(.+)$/){print $1}; このコードを実行すると「koron」が出力されます。 同様に以下のコードで「:」を出力させたいのですが上手くいきません。 $a='*:'; $b='*'; if($a=~/^$b(.+)$/){print $1}; 出力内容は「*:」 これは変数内の文字列がパタンとして扱われているのでしょうか。どうすれば意図する動作になるでしょうか。ご教授願います。

    • ベストアンサー
    • Perl
  • この正規表現のパターンについて

    この正規表現のパターンについての意味を教えてほしい。 【疑問】 $pattern ="/((?:.*?<p>.*?<\/p>){3}).*/mis"; ↓の中の (?:.*?<p>.*?<\/p>){3} ↓の中の 先頭の「 ( 」の次の、「 ?: 」の意味がわかりません。 これは、どのような意味があるのでしょうか? 【今までの流れ】 あることが知りたくて質問しました。 そのページは、こちら http://okwave.jp/qa/q7300031.html 教えていただいた、正規表現で、「出来た、出来た」と喜んで、ベストアンサーとして質問を締め切りました。 正規表現って、言語などの環境により、多少の違いがありますよね? そこで、phpの正規表現を勉強しようと、その正規表現を見ました。 しかし、なぜ、これらの文字があるのかわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現のパターン " [^<]*?>"

    正規表現のパターンの " [^<]*?>" これはどういう意味なのでしょうか?

  • javascriptの正規表現で変数を扱う

    javascriptの正規表現で変数を扱う方法がわからずに困っております。 下記スクリプトの●●●部分に変数をいれるとしたら、 どうすれば良いでしょうか? どなたかご教授ください。 宜しくお願いいたします。 if(/(?:^|\s)●●●(?:$|\s)/.test(obj.className)){

  • 【正規表現】HTML5のpattern属性について

    HTML5のpattern属性で半角英数記号を指定するにはどう記述したら良いですか? HTMLやCSSの学習をしています。 正規表現についてはほぼ分かりません。 (1)ユーザーIDやパスワード入力フォーム半角英数記号のみの入力を処理する場合、type属性は”text”でいいのでしょうか? (2)pattern 属性に使う正規表現はほぼ理解できません。自分なりに調べてみたのですが、以下のような記述だと_アンダーバーや@マークなどの記号は識別できないのではないかと言われました。 また入力文字数制限は正規表現でも出来るようですが、以下のように自分でもわかるminlength, maxlengthで記述しようと思っていまがこれで大丈夫なのでしょうか? サンプルとして以下のように記述してみました。 type属性や、「半角英数記号」の入力文字など正しい書き方を教えてください。 よろしくお願いします。 <input type="text" name="username" pattern="^[0-9A-Za-z]+$" minlength="4" maxlength="50">

専門家に質問してみよう