• ベストアンサー

日本語のマッチング(正規表現)

Perl5.8.7で日本語のマッチングを行おうとしてます. 文字コードはEUCで,[ト],[ユ],[ャ],[ュ]や[ョ] の後にある[ウ]を[ー(長音)]に変換しようとする ものです. 例.ヒャクトウバン→ヒャクトーバン 自分の考えた正規表現では成功しませんでした. if($b[$i] =~ /[\xa5e6\xa5c9\xa5e3        \xa5e5\xa5e7]\xa5a6/){ $b[$i] =~ s/\xa5a6/\xa1bd/; } 文字コードを直接書く方法しかないのか, 日本語はマッチングできるのかなどわからないので, よろしくお願いいたします.

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

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

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

うろ覚えですが, use encoding 'euc-jp'; しておけば正規表現の中でもカタカナって使えませんでしたっけ?

Achilles1993
質問者

お礼

キーワードで(use encoding 'euc-jp';)を 調べたら、関連するページも出てきて、 できそうです。 ありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1もおっしゃってますけどencodingを指定しておけば、日本語のマッチングってできますよ。 use encoding 'euc-jp'; $data="ヒャクトウバン"; $data =~ s/([トユャュョ])ウ/$1ー/g; print $data;

Achilles1993
質問者

お礼

基本形を示していただいてありがとうございます。 3行目は勉強になりました。

関連するQ&A

  • 日本語のマッチング(正規表現)

    以前解決済みとしたのですが、解決していないので もう一度よろしくお願いします。 以下のプログラムは、xxx.txtの内容を例えば、 (1)ぁ→ァ (2)シイ→シー (3)オウ→オー に変化させようというものです。 現在のところ、出力ファイルには何も変化していない ファイルが出力されるだけです。 use encoding 'euc-jp';は5.8.4では通りますが、 5.8.7ではエラーとなってしまいます。 入力ファイルの文字コードはEUC、改行コードはLF。 このperlファイルも同じ文字、改行コードを用いて います。 どのように書けばよいのか、よろしくお願いいたします。 open(IN, "xxx.txt"); open(OUT, "> ***.txt"); while($b=<IN>){ for($i=0; $i<=258; $i++){ if($b[$i] =~ /[ぁぃぅぇぉ]/){ $b[$i] =~ s/[ぁぃぅぇぉ]/[ァィゥェォ]/; } if($b[$i] =~ /[イシチニ]イ/){ $b[$i] =~ s/イ/ー/; } if($b[$i] =~ /[オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ]ウ/){ $b[$i] =~ s/ウ/ー/; } } } close(IN); close(OUT);

    • ベストアンサー
    • Perl
  • MySQL&PHPで日本語検索

    PHP&MyQLでショッピングサイトを作ろうと制作中です。 今、MySQLで日本語検索ができず行き詰ってしまいました。 日本語を16進数に変換して検索させれば、うまくいきそうだと考えていますが、なかなかうまくいきません。 MySQLに登録した日本語データは「EUC」の文字コードを16進数に変換したものです。検索窓から入力した日本語の文字コードもEUCであれば、そのまま16進数に変換してマッチングしてやれば、検索できそうなのですが、 POSTで取得した日本語の文字コードが、どうしてもEUCになりません。 (mb_convert_encodingを使用してもだめだし・・・) POSTで取得した文字列の文字コードの変換は、どうすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • 文字列検索時違う文字でマッチしてしまいます。

    はじめまして。早速ですが・・・。 CGIで文字列検索し、検索語にマッチした場合その文字を抜き出すという処理をしているのですが、違うところでマッチングしてしまいます。 (プログラム、CSVデータともにEUCです。) たとえば・・「海」を検索語として検索した場合、「~こむ~」という部分でマッチしてしまいます。 おそらく「海:[B3A4]」「こむ:[A4B3][A4E0]」でEUCコードになっている為、B3A4でマッチしているんだと思います。 何か有効な検索処理等はないものでしょうか? よろしくお願い致します。

    • ベストアンサー
    • CGI
  • htmlソースを解析、日本語部分がよくわからない

    htmlソースを解析しようと思ったのですが、日本語部分がバイト表現のようなものになっています。 (thunderbirdでソースを見ています) 例えばメールでは「注文内容」となっている部分はhtmlソースでは以下のようになっています。 =E6=B3=A8=E6=96=87=E5=86=85=E5=AE=B9=EF=BC=9A ヘッダの文字コードはutf-8になっていました。 このバイト表現はどのような文字コードなのでしょうか? またPHPやVBA、C#などで日本語への変換は可能でしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • HTML
  • 日本語を含む正規表現の置換

    日本語を含む文字列が$word1、$word2 があります。 $word1から"(xxx)"というような半角カッコに囲まれた文字を削除したいです。 $word2からは"(xxx)"というような全角カッコに囲まれた文字を削除したいです。 カッコの中の文字xxx(日本語)は不特定です。 $word1は以下のコードで上手くいきました。 $word1=~ s/\(.*?\)//; しかし$word2が上手くいきません。 基本的なことかもしれませんが、 色々やってみても上手くいかないので、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 日本語での正規表現について

    「***************** Version 2 *****************」 ↑という文字列を評価して「2」を取りたい為に「/^\*+\s*Version\s+(\d+)\s*\*+\s*$/」という正規表現を使用しています。 「***************** バージョン 2 *****************」 同様に↑という文字列を評価して「2」を取りたいので「/^\*+\s*[バージョン]\s+(\d+)\s*\*+\s*$/」としましたがうまく動きません。 日本語文字列が正しく動作していないようです。 何らかの形でエンコードして当てはめればよいと思うのですが、どのような値を設定すればよいでしょうか? 「バージョン」以外にも「ユーザ」、「日付」などの日本語を同様にマッチさせる必要があるため、変換方法を教えて頂けると助かります。 perlはほぼ使えないため、WebやWindows上でのアプリケーションで指定文字列を渡すと変換できる物をお願い致します。 (perlは入っているためコマンドを叩けばOKというのであればそれでも構いません) 与えられる「バージョン」という文字の文字コードはSJISになります。

    • ベストアンサー
    • Perl
  • 正規表現で全角スペースと誤認

    OS:solaris8 perlのver:5.8.6 perlで、”食器洗い乾燥機|0”という文字列に対し、 空白文字(半角スペース、タブ、改行、全角スペース) が含まれているかを検査しているのですが、 空白文字有りとなってしまいます。 恐らく文字コードの問題だと思うのですが、 詳しくないため、解決方法が分からないでいます。 どのようにしたら解決できるでしょうか? require "jcode.pl"; としているので、jcodeのモジュールで 解決できないでしょうか? 文字コードはEUCです。 以下はソースです。 # 空白文字(半角スペース、タブ、改行、全角スペース)が #入力されていないかチェック $data = "食器洗い乾燥機|0"; if ($data =~ /\s|(?:\xA1\xA1)/) { #含まれている場合 } よろしくお願いします。

    • ベストアンサー
    • Perl
  • 日本語をコード化(16進数)→復元に問題はないですか?

    フォームから入力された日本語(氏名)をコード化する必要があるので、 for(var i=0; i<moji.length; i++){ moji_code += (moji.charCodeAt(i).toString(16)) + ":"; } と、コード化しています。 例:日本太郎 → 65e5:672c:592a:90ce 1文字あたりのコードをなるべく短くする必要があるので16進数にしています。 コード化された日本語を復元する必要もあるのですが、ここで疑問が湧きました。 16進数にすると4桁になりますよね? 16進数自体をよく理解していないのですがString.fromCharCodeで復元しても問題ないのでしょうか? 問題というか、復元したら違う文字になったりはしないものなのでしょうか? 30文字ほど試したところ、違う文字になったことはありませんでしたが心配になり投稿しました。 また、上記のように16進数化したとき、日本語は必ず4桁になるのでしょうか?(こちらの都合上、5桁や6桁になることがあると問題があるので)

  • 日本語だけを抽出したい

    SJIS、EUC、UTF8、のどれがくるかわかりませんが、 かつ、その中で、どの言語がくるかわかりませんが、 その中で、日本語だけを、可能な限り容易に判別する方法は ありますでしょうか? また、既存のモジュールを可能な限り使用しない方法でもあります。 #pureperlで書かれていれば、移植はできますが ひらがな、カタカナを抽出すればいいのもありますが、 仮対処にしかならず、漢字だけの場合の抽出が できなくなってしまいます。 以下、参考までに・・ 内部コードがSJIS? #内部コードも、SJIS、EUC、UTF8のどれになるかわかりません。 UTF8の日本語がきたら、SJISになる UTF8の中国語がきたら、化ける(捨てる対象 EUCの日本語が来たら、SJISになる EUCの韓国語がきたら、化ける(捨てる対象) SJISの日本語が来たら、そのまま ・・のような感じになってしまいますので。。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • パターンマッチングの限界?(最大文字数)

    perl正規表現のパターンマッチングでは,対象文字列が長すぎると正しくマッチしないというような,perlの仕様あるいはバグが存在するのでしょうか? ■状況 CGIフォームから入力された文字列に機種依存文字(EUC未定義文字)が含まれていないかチェックするため,以下のようなスクリプトを書きました。テストでは,ほとんどの場合は正常に動作しましたが,定義文字=パターンマッチするはずの文字に,未定義文字が含まれていると誤判断されてしまうケースがありました。いろいろ試してみたところ,どうも文字数32,768バイトを超えた場合に限られるようだ,というところまで判りました。 ドキュメントなどを見ても,そのような仕様については見つからず,どなたかご存知ないでしょうか。 あるいはスクリプトに不備があればご指摘いただけたらと思います。 よろしくお願いいたします。 if (&is_undef($input_text)) { print "未定義文字が含まれています。"; } … sub is_undef { my ($text, $character_strict); $text = $_[0]; # EUC-JP文字(定義文字) $character_strict = '(?:[\x20-\x7E]|' # ASCII  . '[\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]|' # 1,16-46,48-83区  . '\xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]|' # 2区  . '\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|' # 3区  . '\xA4[\xA1-\xF3]|' # 4区  . '\xA5[\xA1-\xF6]|' # 5区  . '\xA6[\xA1-\xB8\xC1-\xD8]|' # 6区  . '\xA7[\xA1-\xC1\xD1-\xF1]|' # 7区  . '\xA8[\xA1-\xC0]|' # 8区  . '\xCF[\xA1-\xD3]|' # 47区  . '\xF4[\xA1-\xA6])'; # 84区 $text =~ s/\r//g; $text =~ s/\n//g; $text =~ s/\t//g; if ($text =~ /^$character_strict*$/) {  return; } else {  return 1; } }

    • ベストアンサー
    • Perl

専門家に質問してみよう