• 締切済み

正規表現で

以下のようなプログラムを作りました。$arrの中に、(や、[、\マーク等が入っていると、 /[/: unmatched [] in regexp at.. というメッセージが出てプログラムが止まってしまいます。マークの前に\を入れるとエラーにはならないのですが、\を付けずに済む方法はないのでしょうか。今は手作業で\を付けたり消したりしているのですが、単語の数が増えたらどうやって処理したらいいか…。というわけで、解る方、よろしくお願いします。 -------------------------------------------------------------------------- foreach $ch1 (@ch1) { foreach $arr (@arr) { if (/$arr/){ 処理1 }else{ 処理2 } } }

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

みんなの回答

  • akiko
  • ベストアンサー率0% (0/0)
回答No.2

質問の内容を取り違えてたらゴメンナサイ。 これって、メタ文字をエスケープ出来たら良いんですよね? それだったら、if文の前にquotemetaを使うか、マッチさせる時に \Qと\Eで囲んでみれば、上手くいくのでは・・・。 quotemetaを使う例: $arr = quotemeta $arr; if( /$arr/ ) { … \Qと\Eを使う例: if( /\Q$arr\E/ ) { …

ryogoku
質問者

補足

お礼が遅れまして、申し訳有りません!おかげでエラーが出なくなりました。! こちらでまとめてお礼申し上げます。ありがとうございました!!

noname#151056
noname#151056
回答No.1

if (/$arr/){ の行の直前で $arr の中身を修正してやればいいだけだと思います。 修正すべきなのは英数字以外のキャラクタで、それらの前に \を追加すればいいのだから、 $arr =~ s/(\W)/\\$1/g; ってやつを追加してやればいいわけです。

ryogoku
質問者

補足

お礼が遅れまして、本当に申し訳有りません。 何度も答えていただきありがとうございます!おかげで解決いたしました。 ありがとうございました。

関連するQ&A

  • リストデータの検索でのエラー表示について教えてください。

    検索するチェックボックスの配列データに、全て一致するデータを、 データファイルから取り出すコードで以下のようなエラーメッセージが 出ました。 どこが悪いのかわかりません、教えてください。 コード: if (@setubi_o){ my $count=0; for($i=0;$i<$#setubi_o+1;$i++){ if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;} } if($count==$#setubi+1){;}else{next;} } エラーメッセージ(KCatch.pm) [estate.cgi:445:die] /シャワー/: unmatched [] in regexp. > if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;}

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

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

  • WSHの正規表現について

    WindowsXPのCACLSコマンドの出力結果(テキストにリダイレクト)に改行や復帰が入っていて、空行の削除をしたいのです。 下記のプログラムを作ったのですが、復帰コードが 入っている箇所がとれないのです。どなたかご教授お願い致します。。。 Set fso = CreateObject("Scripting.FileSystemObject") Set src = fso.GetFolder("C:\WORK") Set regEx1 = New RegExp srhStr1 = "^ *$" regEx1.Pattern = srhStr1 regEx1.Global = True regEx1.IgnoreCase = True Set TextFile = fso.OpenTextFile("cacls結果.txt") Do Until TextFile.AtEndOfStream tmpLine = TextFile.ReadLine If regEx1.Test(tmpLine) Then else srhLine = srhLine & tmpLine & vbNewLine End If Loop WScript.Echo srhLine

  • VBScriptでの正規表現パターンマッチ

    ASPプログラムの中で 文字列のパターンマッチを正規表現で行ないたいと考えています。 英字と数字両方を組み合わせた文字列(英字と記号且つ数字)であることをチェックしたいのですが 以下のようなロジックでは、英字、数字どちらかだけの文字列もマッチしてしまうのではと思います。 ほかによい書き方はありますでしょうか? Dim strTEST TESTCHECK = 0 Dim objRE Set objRE = new RegExp objRE.pattern = "[_\-a-zA-Z0-9]" If (objRE.Test(strTEST) = True) Then Else TESTCHECK = 1 End If Set objRE = Nothing よろしくお願いいたします。

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

    ある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コードを組んだのですが、このような感じで良いのでしょうか?冒頭で「いろんな言語で」と言いましたが、ここではPHP限定とします。 <? $arr; define("max", 100000); for($i=0; $i<max; $i++) { $arr[$i] = $i; } $mode = 1; $beforeStamp = microtime(true); if ($mode == 0) { for($i=0; $i<max; $i++) { print $arr[$i]."<br />"; } } else if ($mode == 1) { $i = 0; while ($i < max) { print $arr[$i]."<br />"; $i++; } } else if ($mode == 2) { foreach($arr as $value) { print $value."<br />"; } } $afterStamp = microtime(true); print ($afterStamp-$beforeStamp)." / ".$afterStamp." / ".$beforeStamp; ?> 概要ですが、定数maxに設定した数(ここでは10万)の配列を生成し、それを呼び出すというプログラムです。$modeに代入する数値0,1,2のいずれかで呼び出し用メソッド(?)を決め、全配列の中身を呼び出します。メソッド(っていうのも違う気がしますが)はそれぞれfor文、while文、foreach文になっています。これらの処理にかかる速度を測定し、配列の値を呼ぶにはどの方法が一番速いのかを調べたいのです。 間違いがあったり、もっと効果的な方法がありましたら是非ご教授くださいませ。よろしくお願いします。

    • 締切済み
    • PHP
  • 正規表現の一致について

    正規表現のパターンマッチについて、 質問させていただきます。 現在、EUC-JPでパターンマッチングしており、 文章は、全て、半角から全角から処理に変換しております。 foreach(@list){ if($file =~ /$_/){ print"$_\n"; } } 以上のように、$fileの内容に対して、@listにある項目すべてでマッチングしようとしています。 $fileは、長い文章が格納されています。 $_ が 「ローランド_ディー.ジー.」(_は、全角空白)の場合、 print"$_\n"をみると、$file中の「:ランドクルーザー」という部分の”ランド”部分のみが出力されてきました。 文章の途中に出現する単語なので、”^”や”$”等を用いての完全一致が使えずに困っています。 どのようにしたら、$file中の$_と部分的な一致ではなく完全一致(?)になるのでしょうか?

    • ベストアンサー
    • Perl
  • これって何ソート?

    ソートの関数ってものを一回作ってみようかと思って 単純に考えて思いついたのがコレなんですが このやり方ってなんか名前があるんでしょうか? コレって速度的にはどんなもんなんでしょうか? function sepSort(&$arr){ $lower=array(); $upper=array(array_pop($arr)); foreach($arr as $n){ if($n<$upper[0]){ $lower[]=$n; }else{ $upper[]=$n; } } if(isset($lower[1]))sepSort($lower); if(isset($upper[1]))sepSort($upper); $arr=array_merge($lower,$upper); } メモリはジャブジャブ使いますが バブルソートよりははやいみたいです

    • ベストアンサー
    • PHP
  • 正規表現による検索

    正規表現によって文字列を検索し、該当する文字列が存在する場合には存在する旨のメッセージを出力し、存在しない場合には存在しない旨のメッセージを出力するようなプログラムを作りたいのですが現在うまくいっておりません。ソースは以下になります。 #!/usr/bin/perl $logfile = './log_euc.log'; # ログファイル @logs = &read_file($logfile); foreach $log (@logs) { if ($log = ~/hogehoge/ ){ $log_stg = " 変数に文字列hogehogeは含まれています。 "; }else{ $log_stg = " 変数に文字列hogehogeは含まれていません。 "; } print " 判定結果\n "; print " $log_stg\n "; } sub read_file { local($logfile) = $_[0]; open(IN,$logfile); local(@files) = <IN>; close(IN); return @files; } 検索対象のファイル「log_euc.log」は以下です。 hogehoge mugemuge riri ari siri siursoiu sojowijugo hfsoiehrohogehoge sjhoisjofhoge osihojfhoge hsoghsoehogehogesoijggggg 検索結果は以下です。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。

    • ベストアンサー
    • Perl
  • 正規表現 Microsoft VBScript Regular Expression 5.5

    Microsoft VBScript Regular Expression 5.5を参照設定でVBから使ってます。 このRegExpオブジェクトがどうも挙動不審。 Dim REFind As New RegExp REFind.Pattern = "そのた" REFind.IgnoreCase = True REFind.Global = True REFind.MultiLine = True If REFind.Test(moji) Then hogehoge .... というところで、まずぜんぜん "そのた" という文字列が入った文字列にマッチしません。 REFind.Pattern = "の" とかやると、"そのた\ほげほげ" とかにはマッチしますが、"ほげほげ そのた" とかにはマッチしません。 内部で日本語には対応してないんでしょうか? Replaceメソッドで置換文字列としてUNICODE依存のハートマークなどを入れてみましたが、ちゃんとハートに置換してくれました。 だから内部処理はUNICODEだと思うのですが。 それとも、そもそもVBScriptとか書いてあるものをVBから使うのが間違い? ちなみにこのプログラムはFindFirstFileWから受け取ったファイルを正規表現で絞って、さらに正規表現を使って一括でファイル名の変更やコピーなどを行うプログラムです(全然できてませんが)。 表示にはMSForms2.0を使い、正規表現の部分を除けば、ちゃんとFindFirstFileWから受け取ったハートマーク付きのファイルを表示しています。 特にUNICODE依存の文字に置換しようとか思ってるわけじゃないですが。 なので、表示部などのバグではないと思います。 この挙動不審の原因が分かる方、または挙動不審でない正規表現を扱える(できればUNICODE)オブジェクトライブラリなどをご存じの方いらっしゃったらお願いします。 --- W2K+VB6

専門家に質問してみよう