新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: Re: 正規表現での日本語
Date: 1997/01/15 18:31:12
Reference: mesh.program/00167

1月15日に、Hiroさんは書きました。

>sjisコードに$5c(¥)が混ざっていると、正規表現などで誤動作しますよね。
>sjis中の$5cを探して、$5cを重ねてやればいいのでしょうが、
>$5cがsjisの下位(上位?)8bitなのかどうかを判定するのを
>どうすればいいんでしょうか?
>
これは検索文字列に正規表現を使う時の話ですよね? 単純な文字列比較なら漢字中か
どうかにかかわり無く、全てエスケープしてしまえばそれで事足る訳ですから。

いくつか問題点があります。最大の問題は通常の perl では "[あ-ん]+" の様な、
漢字に対する正規表現が利かないことです。通常の perl でこれを実現するために
色々テクニックを弄する事も可能らしいですが、jperl などのように漢字を1文字と
認識する perlパッチを利用するのが簡単でしょう。そうすれば sjis 中の '\' に
関する処理も perlパッチ自身がやってくれます。

あるいは、漢字部分に正規表現が使えないことに目をつむって "記事[0-9]{5}" の
様なものだけでも表現したい、と言う要請もあるでしょうね。この場合、Hiroさんが
おっしゃる様に SJIS 部分に現われる '\' をエスケープする必要があります。

まず、簡単なのは EUC を使うことです。EUC の場合は漢字の類は全て bit7 が
立っていますから '\' などのコードにぶつかることは無いです。まず、全てを
EUC に変換してから行なえば特殊な処理はいりません。必要なら検索結果を
SJIS に戻してから出力すれば良いですね。

もしも検索対象が膨大な SJIS データであり、いちいち漢字変換を行なうのが実質的に
不可能である時には検索漢字のエスケープが必要ですね。その場合でも、一番真っ当な
方法は、最初の文字から順繰りに見ていき、漢字の2バイト目に問題がある文字('\'とか
'@'とか)が現われたらエスケープして行く、と言うものでしょうね。漢字コードが
SJIS と判っている場合にはこの処理は簡単ですよね。SJIS 1バイト目は 0x81〜0x9F か
0xE0〜0xFC ですのでそれを見ていればいいわけです。

もう一つは一寸トリッキーな方法で、あまりおすすめはしませんが、検索文字列を EUC に
変換して漢字中の '\' や '@' を無くし、残りの '\' や '@' を検索文字列中には現われ
ないことが判っているコード (コントロールコードなど) に変換してから SJIS に戻し、
漢字中の '\' や '@' をエスケープしてから本当の '\' や '@' を元に戻す、と言うのが
あります。これだと「見かけは」簡単になります... けど、実際の処理量は多いです。(^^;;