• 締切済み

全角カタカナの確認

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

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

みんなの回答

  • 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

  • 全角カタカナの正規表現

    if (preg_match('/[ァ-ヶー]+/', $value, $match )) { print ("$value"."はカタカナです。"."($match[0])"."<br />") } else { print ("$value"."はカタカナではない。<br />"); } という感じで全角カタカナにマッチさせる正規表現を使いたいのですが、このやり方だと「全角カタカナを含んでいる…」という表現になってしまいます。ある文字列が「すべて全角カタカナである」という正規表現を考えているのですが、なかなかうまくいきません。逆引きのサンプルなんかでもなかなか見つからなくて困っています。  同様に「すべて平仮名にマッチ!」というのにも応用できると思うのですが、なかなかうまく行きません。  是非、そのやり方やヒントをおしえてください。  マルチバイト対応なので[ぁ-ん]のような形で表記できます。またPerl互換(preg_match)で作っているので、Perlに詳しい方も是非是非おしえてください。

    • ベストアンサー
    • PHP
  • 全角カタカナ入力チェック

    PHP5 SJIS 環境 入力した文字列を全角カタカナか調べています。 mb_ereg("^[ア-ン]+$",$str) だけで確認すると『ヴ』や『ァ』の文字がカタカナとして 判断してくれません。 よい方法あれば教えて下さい。

    • ベストアンサー
    • PHP
  • perl の grepで 全角カタカナで検索できません

    perl の以下のソースで、実行エラーになってしまいます。 grep で全角カタカナで検索できないのです。半角カタカナでは、うまく動きました。 全角文字(たとえば’中華’)でも正しく「中華料理」と出力されます。 ’ラーメン’で検索したら、’ラーメン店’と出力されるのが正しいと思うのですが、 なぜ動かないんでしょ? ↓ソース #!/usr/bin/perl @aaa = ("ラーメン店","カレーハウス","中華料理"); @aaa = grep /ラーメン/ , @aaa; print "Content-type: text/html\n\n"; print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"; print <<"HTML"; @aaa HTML exit;

  • 文字列チェックの動作がおかしい・・・

    フォームのメールアドレスチェックで動作がおかしいです。 自分では、問題がないと思っているのですが、どこかおかしなところがあればご指摘ただければと思います。 動作確認を簡単にするために作ったソースは if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG1\n"; }else { print "OK1\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG2\n"; }else { print "OK2\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG3\n"; }else { print "OK3\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG4\n"; }else { print "OK4\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG5\n"; }else { print "OK5\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG6\n"; }else { print "OK6\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG7\n"; }else { print "OK7\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG8\n"; }else { print "OK8\n"; } です。予想していた結果は、全てOKとなるはずだったのですが、予想に反して NG1 NG2 OK3 OK4 OK5 OK6 OK7 OK8 となり、マッチングパターン部分が「^[0-9a-zA-Z\_\.\-\@]+$」となっているときだけ、ハイフンが文字列に含まれていると、予想と違っています。 自分的には??なのですが・・・ どこがおかしいのか、ご指摘いただければと思います。 長文ですみません。

    • ベストアンサー
    • PHP
  • 半角カタカナの入力チェックを作りたいです

    入力フォームで入力された文字に対して半角カタカナかチェックをしたいです。 function CheckHalfSizeKatakana($str) {  if (mb_ereg("^[ア-ン゛゜]+$",$str)) {    return true;  } else {    return false;  } } としたのですがうまくいきません。 PHP4です。

    • ベストアンサー
    • PHP
  • phpのin_array()でわからない事があります。

    phpのin_array()でわからない事があります。 $str = array('リンゴ','オレンジ','バナナ'); if(in_array("オレンジ",$str)){ print "OK"; }else{ print "NG"; } 結果:OK 上記は何の問題もないのですが、 $str = @file('hoge.txt'); if(in_array("オレンジ",$str)){ print "OK"; }else{ print "NG"; } 結果:NG // hoge.txt リンゴ オレンジ バナナ こうするとNGになってしまいます。 最近PHPを始めたばかりで根本的な事がわかってないのかも知れませんが、 もし原因をご存じの方がいれば教えていただけないでしょうか。 すみませんがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perl UTF8 での全角カタカナチェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で全角カタカナと特定の全角記号以外はエラーとする 入力チェック処理(正規表現)がうまくチェックを行ってくれません。 SJISだと以下のような書き方があるそうなのですが、UTF8での書き方がわかりません。 ・SJIS if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外の文字が指定されています"; } UTF8での書き方を教えて頂きたいです。 なお、許容する全角カタカナと特定の全角記号は以下のとおりです。 ========================================================== アイウエオカキクケコサシスセソタチツテトナニヌネノ ハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン ァィゥェォッャュョヵヶヴガギグゲゴザジズゼゾダヂヅデド バビブベボパピプペポーヽヾ ========================================================== ご教授お願い致します。

  • Perlで配列の添え字を抽出したい

    Perl初心者で、既出の質問かもしれませんが、ご教授願います。 以下のように"*"が入っている値を抽出する処理があります。 ーーーーーー処理ーーーーーー @array = ('aaa', 'b*b', 'ccc', 'dd*'); foreach (@array) { if ($_ =~/\*/) { print "OK\n"; } else { print "NG\n"; } } ーーーーーーーーーーーーーーーー ーーー結果ーーー NG OK NG OK ーーーーーーーー <質問> 上記結果より、OKとなった値の配列(添え字)を取得するにはどのようにすれば宜しいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Javascript 全角カナ+半角スペース+全角スペースの正規表現について

    初歩的な質問をしてすみません。 一応、自分でも試行錯誤で if (str.match(/[^ア-ンー\- ]+/g)){ alert("フリガナの項目を「全角カタカナ」のみで入力して下さい。"); } という条件を作ってみたのですが、半角スペースを入力したらTrueとなってしまいます。 全角カナ+半角スペース+全角スペース以外はFalseとなる正規表現を教えていただけないでしょうか。 以上、よろしくお願いします。

  • チェックしなくても、確認のウインドウがでる

    チェックしなくても、確認のウインドウがでてしまうのですが、どこがいけないのでしょうか <SCRIPT language=JavaScript> function SubmitCheck() } if (document.Order.elements[kiyaku_fn].value == ""){ return false; } else if (document.Order.elements[kiyaku_fn].value == "同意"){ alert("規約に同意して下さい"); return false; } var confirm_str = ""; confirm_str = "下記の事項をご確認ください。\n" + "正しければ、OKを押してください。\n" + "--------------------------------\n" + "規約:" + document.Order.elements[kiyaku_fn].value + "\n\n"; temp = 0; confirm_str += "--------------------------------\n"; if(confirm(confirm_str)){ return true; } else return false; return true; } </SCRIPT> <INPUT id=checkbox1 type=checkbox value="同意" name=checkbox1>規約

専門家に質問してみよう