• ベストアンサー

正規表現

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

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

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

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.4

Perlのバージョンが合うなら(5.6以上だったかな?)正規表現パターンを「qr」で囲む方がお勧めです。 (速度的な有利と、正規表現をそのまま書けるので) [hoge@huga hoge]$ cat tmp.pl $\ = "\n"; $patern = qr/\s.+\w/io; print $patern if " 0123" =~ /$patern/; [hoge@huga hoge]$ perl tmp.pl (?i-xsm:\s.+\w) [hoge@huga hoge]$ こんな感じで。

その他の回答 (3)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

変数展開がどのようになり、どんなパターンができるかについての理解が必要ですが、可能です。 こんな感じ: my $value = " 0123"; my $patern = '\s.+'; if( $value =~ /$patern/ ){ print $&, "\n";} 詳しくは、perlopやperlre、perlfaq6などのマニュアルをご覧ください。

参考URL:
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

そういう場合は、''で正規表現を囲みます my $value = " 0123"; my $patern = '\s.+'; if( $value =~ /$patern/ ){ print "yes"; } ””の場合は、何も表示されませんが、 ’’の場合はyesが表示されます

  • iichiho
  • ベストアンサー率37% (416/1114)
回答No.1

正規表現を直接変数に入れることはできません。 理由は、正規表現で加工される前の情報が無いからです。 でも、こういうの(↓)ならできますよ。 $text = 'other'; $text =~ s/^/M/; #sed の置換と同じです。 これで、「$text=Mother」になります。

関連するQ&A

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • javascriptの正規表現で変数を扱う

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

  • 正規表現

    変数$aのなかに変数$bが含まれていたらをperlの正規表現であらわすと どのようになるのでしょうか?if($a=~ /$b/)ではうまくいかないのですか?

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

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

    • ベストアンサー
    • Perl
  • .NET正規表現で(?=...)を使えない?

    お世話になります。 以下のページ(.NET Framework 開発者ガイド>グループ化構成体) http://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx に、.NET正規表現について以下のようなパターンがあります。  (?= subexpression) ゼロ幅の正の先読みアサーションです。(略)  (?! subexpression) ゼロ幅の負の先読みアサーションです。(略)  (?<= subexpression) ゼロ幅の正の後読みアサーションです。(略)  (?<! subexpression) ゼロ幅の負の後読みアサーションです。(略) これらは、あるパターンが注目している前/後に現れる/現れないかどうかをチェックするけど、それらをキャプチャーしないというものです。 これを使いたいのですが、使えません。以下はVBScriptのプログラムで、WSCript 5.6および5.7で動作させました。(インデントを表現するために全角空白を使っています。実際に動かしてくださる方はタブ文字かなにかに変換願います) Option Explicit Dim objRegExp ' 正規表現オブジェクト Dim objMatches ' 検索結果 Dim objMatch ' 検索結果 Dim strMessage ' 表示メッセージ Set objRegExp = New RegExp objRegExp.Pattern = "(?<=「)[^」]+(?=」)" objRegExp.IgnoreCase = True objRegExp.Global = True Set objMatches = objRegExp.Execute("カッコ前「カッコ中」カッコ後") WScript.Echo objRegExp.Pattern & " は" For Each objMatch In objMatches  strMessage = " " & objMatch.FirstIndex + 1 & _   " 文字目に見つかりました。" & _   "一致した文字列は " & objMatch.Value & " です。"   WScript.Echo strMessage Next Set objMatches = Nothing Set objRegExp = Nothing ところが、  objRegExp.Pattern = "(?<=「)[^」]+(?=」)" のところで「正規表現で構文エラーになりました」となります。 これを、もっと簡単なパターン、  objRegExp.Pattern = "(?:「)[^」]+(?:」)" とすれば動くことは分かっているんですが、今の私の主眼としては「(?<=...)」および「(?=...)」を使いたいんです。 他に、Word 2007 の VBA を試しましたがダメでした。 正規表現自体は合っているようです。 というのは、以下のテストツールで動作できたからです。 http://www.ultrapico.com/Expresso.htm ということで、これらの新しい .NET 正規表現を VBScript や VBA で動かす方法はあるでしょうか。 よろしくお願いいたします。

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

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

    • ベストアンサー
    • Perl
  • 正規表現の o オプションの意味が分かりません

    正規表現の質問です。 言語はPerlで組んでいます。 いくつかのhtmlファイルを順に開き、以下のようなコードを実行します。 $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})(?= \/ $num)/o; ここで $http{BODY} 読み込んだhtmlファイル $digit 変数。整数値。 $num 変数。整数値。 この正規表現で、 ・・・・[ No.2 / 3 ]・・・・ といった感じの文字列から、この場合は「2」をマッチさせようとしました。 ところが最初に読み込んだファイルではうまくマッチしたのですが、2番目のファイルではマッチしません。 o オプションを外すとうまくいきました。o オプションは変数展開を1回行うとのことです。元のファイルはやたらとでかいので、o オプションを付けたら少しは早くなるかなと思いつけていたのですが。。。 ネットで調べると、 while( $s = <FH> ){ # 一度だけ展開する if ( $s =~ /$arg/o; ){ .... } このような用例で、$argは変数というよりも、セットされた文字列として評価されるとあります。でも前述の正規表現の2つの変数、$digitと$numは普通に値を書き換えられていましたけど。。。 それとも o オプションを付けた正規表現では、その正規表現を処理するためのメモリ領域に一度変数の値を取り込むと、二度と読み込むことをしないということでしょうか。だから変数の値が変わっても、正規表現が用いるメモリ領域の値は変化しない。。。 でも $http{BODY}=~ /(?<=\[ No\.)([0-9]{$digit})/o; だったらちゃんと$digitの値が変わったことに対応しているんです。他にもいっぱい o オプションを付けた正規表現を用いていますけど、全部正常に作動しています(バグに気づいていないだけかもしれませんけど)。 前述の正規表現とこれら正常に作動する正規表現の違いは、後者が変数1個であるのに対して、前者は2個であるということです。「変数展開を1回行う」の意味は、変数1個にしか対応しないという意味なのでしょうか。でも前者も最初のファイルだけなら2個の変数に対応しているのです。 どういうことなのでしょう。

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

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

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

    VB6ですが・・・ '次のようなコードがあって <!-- と --> に囲まれる文字列を抜き出したのですが 'どのようなパターンマッチを書けばいいのでしょうか? 'HTMLのコメントのみを抜き出したいと思っています。 Const s = "<!--今日-->" _ & "<!--僕は--><!--正規表現を--><!--勉強します-->" Dim x As RegExp Dim v As match Set x = New RegExp x.Pattern = "パターン" x.Global = True For Each v In x.Execute(s) Debug.Print v.Value Next

  • 正規表現について

    いつもお世話になっております。 以下の正規表現の記述の仕方が分からないのですが、 ご存知の方教えて頂けますでしょうか? (やりたいこと) 以下のような記述がある場合、value=の値が空の時は 処理Aをしたいというif文を書きたいのですが 書き方が分かりません。 if($orginal =~ /<option value=\"\"/){ 処理A } のようなif文を記述したのですが、 2行目の「テスト」も引っかかってしまいます。 どのように記述すればよいのでしょうか? <option value="" >選択してください</option> <option value="テスト" >テスト</option>

    • ベストアンサー
    • Perl