• 締切済み

全角カタカナの確認

perl 初心者です。 $str が全て全角カタカナかどうか確認したいのですがうまく行きません。 $str="アイウエオ"; などとして if ($str =~ /^[ア-ンーヽヾ]/){ print "OK\n"; } else {print "NG\n";} とすると、先頭の文字が全角カタカナかどうかの確認ができます。 ネット上の古い記事を見て if ($str =~ /^[ア-ン][ア-ンーヽヾ]+$/){ print "OK\n"; } else {print "NG\n";} としたのですが、NG になってしまいます。何処が違ってるのでしょうか。 [ア-ンーヽヾ] の部分は、「ーヽヾ」は先頭には来ないのでこうしたとのことです。 よろしくお願いしまう。

みんなの回答

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

> OKWebsさんから、下記のような、以前の回答事例の案内があったのですが... 示されたコードは、SJIS/EUC 専用で古~いPerlでの方法ですね。 今のPerlでも可能ではありますが、これからPerlを覚えようとされてる方に示すのは有害と言っても過言ではありません。 なので、使用法の説明は私はしません。 # 古い方法に馴染んだ後で新しい方法を理解するのはとても大変です。 回答 No.1 にも書きましたが、正規表現中に \x83[\x40-\x7e\x80-\x96] とかの難解文字列じゃ無く全角文字そのものを書くには utf8 か encoding の use が必要です。 お勧めは、 use utf8; を書いて、スクリプトを URF-8 で保存する事です。 ご自分のテストスクリプトでご確認ください。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

ぱっと見ただけでも不安と問題が沢山あります。 不安1 正規表現中に非ASCII文字をベタで書くためには、それなりの条件が必要です。 use utf8; してますか? それとも use encoding("Windows-31J"); してますか? 条件をはずすと、結果は信頼できません。 そのあたりが書かれていない参考ページは、古すぎて参考にしてはいけないか、あるいは書いた人の力が全く不充分です。 本当に書かれていないなら、参考にするのをやめましょう。 問題1 [ア-ン] には、「ァ」、「ヴ」等が含まれません。 http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF の 30A0 あたりを見て、あなたが希望する範囲を指定しましょう。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html も参考になります。 問題2 /^[ア-ン][ア-ンーヽヾ]+$/ は、1文字の全角カナにマッチしません。 マッチさせるには、最後の +$ を *$ に替えてください。

yamakawa8
質問者

お礼

UTF8については、全く知識がないので、下記で解決しました。 if ($string =~ /^(?:\xA5[\xA1-\xF6])(?:\xA5[\xA1-\xF6]|\xA1[\xA6\xBC\xB3\xB4])+$/){ print "OK\n"; } else {print "NG\n";} ※EUC-JP $string="アカサタナ"; #ok #$string="ルーレット"; #ok #$string="アカサたナ"; #ng #$string="アkaサタナ"; #ng ありがとうございました。

yamakawa8
質問者

補足

ご指摘のように、その後、上に示した方法には、問題があることがわかりました。 OKWebsさんから、下記のような、以前の回答事例の案内があったのですが、使い方がよくわかりません。$line に文字列を指定しても、何も表示されません。 テスト文字列は、どう指定したらよいでしょうか。 よろしくお願いします --------------------------------------------------------- 質問 $str に 全角カタカナ以外の文字が含まれるかどうか調べるにはどうしたら良いでしょうか。 回答 #!/usr/bin/perl use strict; use warnings; my $kanaletter = qr<\x83[\x40-\x7e\x80-\x96]>; #my $kanaletter = qr<\xa5[\xa1-\xf6]>; while (my $line = <DATA>) { chomp $line; if ($line =~ m/^${kanaletter}+$/) { print "'$line'は全角カタカナだけです\n"; } else { print "'$line'には全角カタカナ以外の何かがあります\n"; } } 実行例 'カタカナダケノモジレツ'には全角カタカナ以外の何かがあります 'ひらがなとカタカナ'には全角カタカナ以外の何かがあります ''には全角カタカナ以外の何かがあります 'ァヶ'には全角カタカナ以外の何かがあります コメントになってない方がSJIS、なっている方がEUC-JPです。

関連するQ&A