- ベストアンサー
文字列置換
和文・欧文混じりの文章の、アルファベット部分に*印をつけるプログラムを作成したいのですが $line=~s/([A-Za-z])/\*$1\*/g; とすると、 東京都千代田区SE を 東京都千代田区*S**E* としたいのに 東京・s*千代・c*区*S**E* のように和文部分まで化けてしまいます。 漢字の文字コードが問題だろうということまでは解るのですが、 どうやって欧文だけ置換して良いのか解りません。 よろしくお願いします。
- みんなの回答 (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引数の内容にご指定の加工を加えて返す関数です。(全角スペースをタブに置き換えれば動きます)
その他の回答 (1)
それは、漢字コードをちゃんと見分けてやる必要があります。 $line =~ s/([^\x81-\x9F\xE0-\xEF])([A-Za-z])/\*$2\*/g; もしかしたらこれでうまくいくかもしれません。
お礼
凄い!凄いです! こんな事までしていただけるとは!! 質問して良かった!! ありがとうございました!! しかし何をやっているのか解らない自分の頭が憎い…。 勉強します。 本当にありがとうございました!!