正規表現中に”深”の文字が使えないのはなぜ?

[上に] [前に] [次に]
じぇい 1999/09/06(月) 00:12:16
Perlを使って、

if($city =~ /^(東松山|日高|深谷|富士見|本庄|三卿)$/){
  $city .= "市";
}
、というようなコードを書いていました。
しかし、これではサーバーエラーになりました。
自分なりに原因追求してみたところ、”深谷”の”深”の文字がサーバーエラーの原因だったようです。
上記のコードを

if($city =~ /^(東松山|日高|富士見|本庄|三卿)$/){
  $city .= "市";
} elsif($city eq "深谷"){
  $city .= "市";
}
と直したところうまくいきました。
文字コードは ”シフト JIS” で書いていました。
また、スクリプト内で扱っている情報もjcode.plで”sjis”にしています。
正規表現内で”深”の文字は使えないのでしょうか?
ローカル(OSはウィンドウズ)で試してもサーバー上(OSはUNIX)で試しても同じでした。
どなたかわかる方がおられれば教えてください。
情報不足やわかりにくい説明などがあればご指摘下さい。

B-Cus 1999/09/06(月) 02:36:14
http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/faq/faq2.html#c4

へっぴり腰 1999/09/06(月) 02:43:37
”sjis”で ”深”の文字は、コードで表すと「%90%5B」になります。
この時、「%5B」は「 [ 」を表すASCIIコードです。
http://www.tohoho-web.com/wwwkanji.htm
つまり深がShift_JISでマッチさせられない理由は「ー(%81%5B)」が使えないのと一緒です。

>正規表現内で”深”の文字は使えないのでしょうか?
残念ながらShift_JISでは使えません。
euc-jpにすればこの問題は解消できますが。

mm 1999/09/06(月) 03:20:21
>残念ながらShift_JISでは使えません。
使えなくはないですが、すくなくとも日本語文字コードを調べたりできる環境や、
それなりの知識は必要です。

例えば、検索文字列(Shift-JISを考慮しない正規表現)が$regに入っているとして、
$reg =~ s/([\x81-\x9f\xe0-\xfc])(.)/&sjis2reg($1,$2)/eg;
sub sjis2reg {
 local($j1,$j2) = @_;
 $j2 = "\\$j2" if $j2 =~ /[\[\\\]\{\|\}]/;
 $j1.$j2;
}
とすれば、検索可能な正規表現に変換できます。
また、ここのラウンジの検索も、Shift-JISでやってるので、この方法を使っても
いいかも知れません。
http://www.tohoho-web.com/cgi-bin/wwwlng.txt
の「# メタ文字を無効化する」というコメントのあたりです。

ただし、Shift-JISの場合も
http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/faq/faq2.html#c4
の[注意:EUCの落とし穴]と同じ問題は発生します。

B-Cus 1999/09/06(月) 03:48:54
> # メタ文字を無効化する」というコメントのあたりです。
やってることは同じですが、\Q〜\E で囲む、quotemeta を使う
ってのも紹介しときます。ただし perl5 専用。

Ex1.
 if($city =~ /^(東松山|日高|\Q深谷\E|富士見|本庄|三卿)$/){
Ex2.
 @cities = qw(東松山 日高 深谷 富士見 本庄 三卿);
 @cities = map { quotemeta($_) } @cities;
 $cities_regexp = join('|',@cities);
 if($city =~ /^($cities_regexp)$/){

じぇい 1999/09/06(月) 05:11:14
[[解決]]
B-Cusさん、へっぴり腰さん、mmさん、どうもありがとうございました。
教えていただいたページで、文字コードについて勉強させてもらいました。
ラウンジの検索のようなものではなくスクリプトであらかじめ正規表現内で使う文字がわかっている場合は\Q〜\Eで囲む方法でメタ文字を無効にするのが一番簡単だったのでそれを使ってうまくいきました。

じぇい 1999/09/06(月) 05:20:00
あれっ、上の発言なんか変ですね。

>ラウンジの検索のようなものではなくスクリプトであらかじめ正規表現内で使う文字がわかっている場合
じゃなくて、、
Perl5の場合、ですね・・・。

ワイ 1999/09/06(月) 11:57:31
EUCの落とし穴については
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
あたりが役に立ちそうな予感。
# ただし、どれくらい重くなるかについては責任持てません。

[上に] [前に] [次に]