• ベストアンサー

小文字から大文字への変換後のパターンマッチ

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

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

Shift_JIS コードを使っている場合、パターンマッチ以前の問題として、日本語文字列に uc を適用するとその時点で文字化けの可能性があります。 $name = "テニスコート"; $name = uc $name; print "$name\n"; # ウカスコーエ 元の文字列を大文字化せずに正規表現に /i フラグを付ける対応策があるのですが、この場合も正規表現に日本語文字列が含まれていると問題があります。日本語文字は2種類の文字にマッチしてしまうものが多数あります。"テニスコート" の例では "ー" 以外の文字が2種類の文字にマッチするので、32 (2 の 5 乗) 種類の文字列とマッチすることになります。 対応策としては、"テニスコート" は index で、"TENNIS" は正規表現の /i フラグで処理するのがいいと思います。 if (index($name, "テニスコート") >= 0 or $name =~ /TENNIS/i) { push(@error, 'テニス関係は入力できません'); }

masa-25
質問者

お礼

具体的に説明してくださり、ご親切にありがとうございますm(_ _)m /iで実験してみたのですが、kumozさんご指摘の通り、 関係ない日本語にもマッチしてしまい、どうするべきか考えていた次第です。 とても参考になりました。この方法で対応させていただきます!!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

それだけなら「大文字・小文字の区別を無視してマッチ」させればいいだけ. わざわざ大文字に直す必要はない. そして本題については #1 にも書いたけどほぼ間違いなく文字コードがらみなので, 使ってる文字コードだったり use などによる文字コードの指定などを見直すこと.

masa-25
質問者

お礼

二度もどうもありがとうございます。 /iでマッチさせる方法を知っていたにもかかわらず 思いつきもしなかった自分の力量のなさを痛感しました。 文字コード見直ししたいところですが、 かなり複雑に見直しが必要なのでどうにかならないか考えていました。 ほんとありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

文字コードがらみで何かすりゃいいんじゃない? なんでわざわざ大文字に直さにゃならんのかがさっぱり理解できんのだけど.

masa-25
質問者

補足

$nameで入力されるものに例えば「Tennis」「TeNNis」などという制限回避のための 入力があった時でも一度、英字を大文字に整えて禁止ワードがないからチェックいれるためです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

    • ベストアンサー
    • 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
  • パターンマッチで変数でマッチさせるには?

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

    • ベストアンサー
    • CGI
  • パターンマッチについて

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

    • ベストアンサー
    • Perl
  • Perlにおけるパターンマッチ

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

    • ベストアンサー
    • Perl
  • / [ 【 の文字をマッチさせるには?

    / [ 【 の文字をマッチさせるには? 環境 perl version 5.005_03 while($line = <IN>){ if($line =~ ///){ (マッチした場合の処理) } } などとしたいのですが、/ [ 【 の文字にマッチさせるには どのように記述したらいいのでしょうか? 上記のように普通に指定するとマッチしませんでした。 よろしくお願いします。

  • 漢字などを正規表現でパターンマッチさせる方法?

    こんにちは,よろしくお願いします。 名前(姓と名に分けて)を入力してもらうフォームを作っています。 姓名を日本語,つまり,漢字,ひらがな,カタカナを全角(2バイト文字?)で入力してもらいたいと考えています。 ぜんぜんわからないのですが,パターンを次のように考えて, var pattern = "[亜-熙ぁ-んァ-ヶ]+"; if(seimei.match(pattern)){ 上記のようにやってみたらうまくいったように思えましたが,「蓬莱」や「紀香」などの漢字を入力するとマッチしません。 文字セットは”UTF-8”を使っています。 すべての漢字,ひらがな,カタカナをマッチさせるようにするにはどのようなパターンで行えばいいのでしょうか?教えてください。 よろしくお願いします。

  • パターンマッチ

    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
  • 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 よろしくお願いいたします。

  • JavaScript文字列連携に関して

    質問させて頂きます。 下記のようなテキストフォームがあったとして、submit押された時に、jsを走らせ、テキストに数値以外が入っていないかチェックしたいと考えています。 ------------------------------------------------- <input type="text" name="text_1" /> <input type="text" name="text_2" /> <input type="text" name="text_3" /> ------------------------------------------------- チェック自体は下記のような記述で行うことが出来ました。 ------------------------------------------------- if(document.form1.text_1.value.match(/[^0-9]+/)){ //文字です } if(document.form1.text_2.value.match(/[^0-9]+/)){ //文字です } if(document.form1.text_3.value.match(/[^0-9]+/)){ //文字です } ------------------------------------------------- ですが、同じif文を並べて記述したくなかったので、for文を使って記述したいと考えました。 ------------------------------------------------- for (var i=1 ; i<=3 ; i++){ if(document.form1.text_1.value.match(/[^0-9]+/)){ //文字です } } ------------------------------------------------- この時、if文内のtext_1をどのように記述すれば、text_1,text_2,text_3と変化させることが出来るでしょうか。 ※「text_ + i +」等試してみましたが、正常に動作出来ませんでした。 ご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 また、質問の内容に不備な点があるかもしませんが、その際はご指摘頂けると幸いです。 よろしくお願いいたします。