改訂:2017/07/22
Unicode 10.0に合わせて書き直し。正規表現を簡易にしようとしてやりすぎていたのを修正。
改訂:2023/03/21
U+30000以降を追加。InDesignの正規表現を追記。
正規表現で漢字の範囲指定をする場合、Unicodeではどうするかが悩ましいところです。
Unicodeの漢字の範囲として [一-龠] にしている例を見かけます。しかしこれは旧規格JIS X 0208の漢字が含まれる範囲をUnicodeの中から切り出しているだけです。互換漢字ブロックをまるごと取りこぼしているので、WindowsのシフトJIS(CP932)の拡張漢字に当たるものが含まれていません。現規格JIS X 0213の第3・第4水準漢字も考慮されていません。簡易な範囲指定だとしても、新常用漢字の「𠮟」が含まれておらず、今から見るとあまりに時代遅れです。
Unicodeのすべての漢字の正規表現 その1
環境によってはUnicodeスクリプトの \p{Han} が使えます。対応するコードポイントの一覧はこちらで確認できます。
※リンク先はUnicodeの最新のバージョンではない場合があるので注意してください。
UnicodeSet で \p{Han} の対応コードポイント一覧を表示
Unicodeのすべての漢字の正規表現 その2
\p{Han} が使えない環境は普通にあります。使えたとしてもUnicodeの最新バージョンに対応しているとは限りません。しっかりマッチさせたい場合は、範囲指定をするしかありません。その際、漢字はUnicodeの中であちこちに分散しているので、シンプルな範囲指定は不可能です。
Unicodeの漢字の内訳は以下になります。
※コードポイントの範囲は未定義箇所を含めています。\p{Han} に含まれるハングルの数字(12文字)は除外しています。Unicodeのバージョンが上がっても対応できるようにBMP外はU+2FFFFまで含めています。
2E80..2FDF CJK部首補助+康熙部首
3005 々(漢字の踊り字)
3007 〇(漢数字のゼロ)
303B 〻(漢字の踊り字)
3400..4DBF CJK統合漢字拡張A
4E00..9FFF CJK統合漢字
F900..FAFF CJK互換漢字
20000..3FFFF CJK統合漢字拡張B〜G+CJK互換漢字補助+CJK統合漢字拡張H+念のためU+3FFFFまで
これをまとめると、下記になります。いかがでしょうか。
[\x{2E80}-\x{2FDF}々〇〻\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{3FFFF}]
InDesign CS3~2023(18.1)
InDesignの漢字のワイルドカード「~K」は使いものにならないので、上記の正規表現を使った方がいいでしょう。
InDesign 2023(18.2)~
「~K」が改善されたので、短くできます
[\x{2E80}-\x{2FDF}々〇〻~K\x{30000}-\x{3FFFF}]