西夏倉頡検索の使い方~正規表現入門~

西夏倉頡字碼捜索では、倉頡コードを使って正規表現(漢:正則表現)で字を検索できます。部首で検索するよりも圧倒的に速く、四角号碼よりも柔軟に検索条件を指定できるため、電子化されていない西夏文テクストを読む際に威力を発揮します。

たとえば右側が𘤑なのはわかるが、左側が不鮮明で判読できない字があったとします。検索ボックスに yo と入れて検索するだけで倉頡コードに yo を含む11字が表示され、そのうち7字が𘤑をツクリに持つことが即座にわかります。検索結果の各文字が古今文字集成へのリンクになっていますから、あとはリンク先で意味を調べるなり、字形から絞り込むなりして7字のうちのどれかを特定するだけです。

検索データについて

倉頡コードには入力コード(輸入碼)と全字コード(全字碼)の二つがあります。入力コードはみなさんが学習中の、省略規則によって1字を5打以内で打てる様にしたコードです。全字コードは仮に省略がないとすれば打つことになるコードです。この全字コードはつまり西夏文字の字形を丸々コード化したものなので、字形で字を検索するのに使えるというわけです。

検索画面で「捜索全字碼」の代わりに「捜索輸入碼」を選択することで、一応入力コードでも検索ができる様になっています。

正規表現について

正規表現とは

正規表現は文字列を検索する際などに、複雑なパターンを指定するための表現方法です。

プログラミング言語で正規表現を扱うときは /yo/ などの様に最初と最後をデリミタで囲むことになっていますが、西夏倉頡字碼捜索ではデリミタは必要ありません。

アルファベット A-Za-z は正規表現でもそのままの意味です。 aa または AA で検索すれば、倉頡で A で取る要素が二つ連続している字、つまり𗃣 (VAA), 𗃪 (VAAI), 𗆭 (LLAABU)... などがヒットします。小文字と大文字はどちらでも検索できる様に設定してあります。

アルファベットを除く ASCII の記号の多くは正規表現で特別な意味を持ちます。以下、西夏倉頡字碼捜索で使うものを簡単に説明します。

開始と終了

^ は字の先頭、 $ は字の末尾を表します。

たとえば ^tjm で検索すると(全字コードを検索。以下断りがなければ同じ)、倉頡コードが TJM で始まる32字がヒットします。このうち1字が𘤘に始まる字、2字が𘫄を持つ字、1字が𘡩にたまたま字身𗀀が続く字で、残りはすべて𘡩にたまたま横棒で始まる次字首が続く字です。ここから字首の𘣗は独立した字素でなく、𘫄の一部として2字にのみ現れることがわかります。

今度は tjm$ で検索すると、倉頡コードが TJM で終わる49字がヒットします。今度は𘫕が6字ある( mtjmtjm$ でさらに検索すると数える手間を省ける)他は目立ったパターンはありません。よって字の最後の𘣗は独立した字素であることがわかります。

ドット

ドット . は任意の1文字を表します。

例えば ^.e で検索すると、字の最初に𘢌𘠁𘠛𘡊などが一つだけあってその次にサンズイ𘠣が続いている様な字がヒットします。32字あるそうです。

今度は ^..$ で検索してみます。最初から終わりまでに何かが2文字あるコード、つまり2つの字素だけからなる西夏文字にしては単純な字がヒットします。果たして何文字あるでしょうか。

文字クラス

[ ] で囲んだ部分は文字クラスを指定します。文字クラスは [ ] 内の文字のどれか1字にマッチします。たとえば ^[axz]snn なら𘢌𘡃𘤊のどれかで始まっていて、右側が𘡑の字というわけです。AXZ は紛らわしいことが多いですがこれだけで2字に絞れます。

量指定子

{} で数字を囲むことでパターンの繰返しを指定できます。 ^[almbstj]{2,4}$ なら「基本字形(二)」の回までに習ったキーだけを使って2字素以上4字素以内からなる字を絞り込めます。同じキーの基本字形と輔助字形は区別できないので𘠡が紛れ込んでいますが、概ね簡単な字ばかりがヒットします。

ここまで全字コードのみを検索してきましたが、入力コードを使ってみましょう。西夏倉頡で3打以内で入力できる字が何字あるか知りたいとします。 . で任意の1字を表せますから、「捜索輸入碼」を選択して ^.{0,3}$ とすれば答えがわかります。結果は516字で、西夏倉頡全体が6145字ありますから一割弱というところです。 ^.{4}$ とすると4打で打てる字は2389字、 .{5} とすると5打の字は3240字とわかります。

逆に一番複雑な西夏文字は何かを調べてみます。全字コードに戻って、 .{10,} とすると10字素以上からなる193字が出てきます。この様に , の後は指定しないことも可能です。10 を 11, 12 と増やしていくと、 .{14,} で1字になりました。この字 𘔉 が一番複雑な字の一つと言えそうです。

特別な量指定子

? * + は特別な量指定子です。 ?{0,1} に、 *{0,} に、 +{1,} に相当します。たとえばある字の左側が𘢌𘤄か判別できず、真ん中に何かがあるけどやはり判別できず、右側は𘤊であるとします。 ^h?a.+z$ とすることで「ha か a で始まり、間に任意の字素が1つ以上あり、zで終わる」という条件に合う字を絞り込みます。14字がヒットしますが左中右の構造になっていて右が𘤊なのはそのうち𗦋𗦌𗩀𗩳𗪷𗼍𘴂𗼩の8字です。あとは古今文字集成に飛んで意味を考えます。

先読みと戻り読み条件

(? … ) は検索文字列に隣接する条件を指定します。この括弧の中にある ? は量指定子の意味を持ちません。

の4種類があり、西夏倉頡字碼捜索では否定先読みと否定戻り読みをよく使います。

例えば𘢎の下の部分が判別できず、𘥿でないことはわかるとします。 hq(?!k) で検索すると𘥿以外の HQ を絞り込みますが、検索結果に関係ない𘣾が目立っています。そこで更に hq(?![kj]) とすると𘣾も除外でき、結果は14字に絞られます。ここまできたら字の大まかな形からどれかは特定できそうです。これが否定先読みです。

判っている部分の前に否定条件を設定する時は否定戻り読みになります。例えば𘠆で終わる字を知りたいとき、単に u$ で検索するとヒットする419字のほとんどは𘡺𘢀𘡾……など別の要素を持つ文字です。そこで U と複合字形を作るキーを除外して (?<![bdtqmw])u$ で再検索すると、無事に複合字形が除かれた𘠆だけの検索結果7字が得られます。

その他のコントロール

出力について

できないこと