パターンマッチにおける「-」の扱い

このQ&Aのポイント
  • パターンマッチにおいての「-」の扱いについて
  • エラーが発生する記載方法と正常に動作する記載方法がある
  • 理由について詳しく教えて欲しい
回答を見る
  • ベストアンサー

パターンマッチにおける「-」の扱い

例えば以下のように記載するとエラーとなります。 if($::FORM{'body'} =~ /パターン/){ push(@error, '投稿できません'); } しかし、以下のように記載するときちんとパターンマッチします。 このふたつともエラーが出ておかしくないと思うのですが なぜ以下ならOKなのか教えてください!! @word=qw(パターン); foreach (@word) { if (index($::FORM{'body'},$_) >= 0) { push(@error, '投稿できません。'); } }

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

Shift_JIS使ってませんか? もしそうなら、いわゆる「だめ文字」と呼ばれる問題です。 ーの2バイト目は [ です。「ー」と一文字に見えますが、Perl内部では2文字として処理されます。 そのため、メタ文字 [ に対する ] が無いのでエラーになります。 「ソ」「表」等の2バイト目が\なのは有名ですが、正規表現では、他にも注意しないといけない文字があります。 https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp/table Perlで考えたら@もリストに使いますから、正規表現でなくても問題になりえます。 あと、これはPythonでの話しですが、Perlでも同じような現象が起こります。 http://okwave.jp/qa/q7630123.html 最近のPerlなら、 ・ use utf8;してutf-8でスクリプトを記述 ・入出力はencode/decodeでバイト列⇔utf8文字列の変換する。(またはPerlIOを使う) のがいいと思います。 > if (index($::FORM{'body'},$_) >= 0) { index関数は、文字列を単純に比較するだけです。 正規表現ではありません。なので [ が混っていても問題ありません。

masa-25
質問者

お礼

大変丁寧な回答をいただき、また分かりやすくありがとうございます。 大変よく理解できました。

関連するQ&A

  • Perlにおけるパターンマッチ

    パターンマッチの勉強をしていたところ 偶然「ちょう」という言葉を以下のように書くとひっかからないことに気づきました。 なぜ「ちょう」という日本語だとひっかからないのでしょうか? また「ちょう」がパターンマッチにひっかかるようにするのにはどうすべきなのでしょうか? if($word =~ /ちょう/){ { &error("エラー","「ちょう」という言葉は使用できません"); }

    • ベストアンサー
    • Perl
  • パターンマッチ

    The remained line is shown below. Outline Lab's file A and B ファイルの中身は上記のようになっています。 サブルーチンを作り、パターンマッチで1行目以外を新しいarrayに入れようとしています。 以下のように書きましたが、空白行を選択してしまいます。どうしたら目的のように動くようになりますか? 宜しくお願い致します。 use strict; my @new_line = skip(@input) sub skip { my @lines = @_; my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); foreach my $line(@lines) { my $word = join ("|", @skip); if ($word =~ /^\$line$/) { push @new_line, $line; } } return @nnew_line; }

    • ベストアンサー
    • 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
  • パターンマッチについて

    perl初心者です。文字列がパターンマッチするかを検査したいのですが、検査文字列にカッコ"()"が含まれているので期待する結果を得られません。(マッチしているように見えるが実行結果はマッチしていないになる)カッコによりパターンがグループ化されているように思えるのですが。原因と対処をご教示ください。 $word = "Remote Procedure Call (RPC)" $chk_word = "Remote Procedure Call (RPC)" if ($word =~ m/$chk_word/ ) {・・・・ よろしくお願いします。

    • ベストアンサー
    • Perl
  • パターンマッチで変数でマッチさせるには?

    教えて下さい。 パターンマッチで変数$aaa(中身は2バイト文字)でマッチしたいのですが どう書いたらいいんでしょう? 以下のように書いたらマッチしませんでした(;ω;) if($value[5] =~ /^($aaa)/)

    • ベストアンサー
    • CGI
  • 小文字から大文字への変換後のパターンマッチ

    以下のように英数字を小文字から大文字に変換し、 その後、パターンマッチさせるように記述し、 $nameをテニスコートてみてもマッチしませんでした。 たぶん\Qテニスコート\Eの\Q~\Eが問題なのだとは思うのですが \Q~\Eがないとエラーとなってしまうため、外せません。 このような場合、どうしたらいいのでしょうか? $name = uc $name; if($name =~ /\Qテニスコート\E|TENNIS/){ push(@error, 'テニス関係は入力できません'); }

    • ベストアンサー
    • Perl
  • 禁止ワードのすり抜け対策

    現在、以下のようにして禁止ワードを設定しています。 httpという単語を禁止ワードにしているのですが この禁止ワードをすり抜けるために h t t pなどと書き投稿して利用者を悪質な出会い系サイトに誘導しようとする者がおり、困っております。 半角・全角スペースを使って禁止ワードをすり抜けようとする行為をン防止することは可能でしょうか? foreach (@deny) { if (index($FORM{'sender'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'from'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'sub'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'comment'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } }

    • ベストアンサー
    • CGI
  • すべてにパターンマッチしてしまうのはなぜ?

    以下のようなスクリプトを書いた時に my @list = ('ab', 'cd', 'efg', 'hijk'); foreach my $line (@list){ #print "$line\n"; if ($line =~ m/ ^a| ^e| /x){ print "$line "; }} 標準出力は ab cd efg hijk となり、@list内の要素すべてにマッチしたことになってしまいます。 理由がわからずごちゃごちゃといじっていると、検索部分を =~ m// としても全く同じことになります。 これは、どの配列の要素も空(くう?)を含むためにヒットしてしまう・・・ ということなのでしょうか? どのように理解すれば良いのでしょうか?基本的な質問で申し訳ございませんが、どなたかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 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 よろしくお願いいたします。

  • CGI掲示板~禁止ワード追加カスタマイズ

    やっとここまでできました。 前回の質問の後に追加できないので、新たに投稿します。 詳しい内容は前回の質問を見て下さい。 なんとか独自で以下のように禁止ワードを設定できましたが、 最高でも18個が限界のようです。あとはエラーが出ます。 これを好きなだけ設定する方法を教えて下さい。 初期設定の中に追加 ↓↓↓ ## 禁止文字 @haijyo = ( ,'殺' ,'死' ,'宣伝' ,'無修正'); 実際の登録処理の中に追加 ↓↓↓ # 禁止処理 foreach $haijyo (@haijyo) { if ($comment =~ /$haijyo/) { &error('コメントに禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($name =~ /$haijyo/) { &error('名前に禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($title =~ /$haijyo/) { &error('タイトルに禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($risou =~ /$haijyo/) { &error('希望する相手に禁止ワードがあるようです'); } } ここまで必死にきました。宜しくお願いします。

    • 締切済み
    • CGI

専門家に質問してみよう