• ベストアンサー

文字列置換

和文・欧文混じりの文章の、アルファベット部分に*印をつけるプログラムを作成したいのですが $line=~s/([A-Za-z])/\*$1\*/g; とすると、 東京都千代田区SE を 東京都千代田区*S**E* としたいのに 東京・s*千代・c*区*S**E* のように和文部分まで化けてしまいます。 漢字の文字コードが問題だろうということまでは解るのですが、 どうやって欧文だけ置換して良いのか解りません。 よろしくお願いします。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.2

 すいません(^_^;  下記のじゃ動きません(^^;゜。  どうしても正規表現だけでは駄目だったので、お詫びに確実に動くソースを作りました(笑) あんましスマートなソースじゃないですけど……。 sub editstring {   local($result);   for ( $i = 0; $i < length(@_[0]); $i++ ) {     $c = substr(@_[0], $i, 1);     if ( $c =~ /[\x81-\x9F\xE0-\xEF]/ ) {       $result .= substr(@_[0], $i, 2);       $i++;     } elsif ( $c =~ /[A-Za-z]/ ) {       $result .= "*".$c."*";     } else {       $result .= $c;     }   }   return $result; }  第1引数の内容にご指定の加工を加えて返す関数です。(全角スペースをタブに置き換えれば動きます)

ryogoku
質問者

お礼

凄い!凄いです! こんな事までしていただけるとは!! 質問して良かった!! ありがとうございました!! しかし何をやっているのか解らない自分の頭が憎い…。 勉強します。 本当にありがとうございました!!

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 それは、漢字コードをちゃんと見分けてやる必要があります。 $line =~ s/([^\x81-\x9F\xE0-\xEF])([A-Za-z])/\*$2\*/g;  もしかしたらこれでうまくいくかもしれません。

関連するQ&A