• ベストアンサー

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

以下のように英数字を小文字から大文字に変換し、 その後、パターンマッチさせるように記述し、 $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