LANG SELRCT

コードを書く場所についてはこちら

2018年5月2日水曜日

文字列の中から漢字を抽出する正規表現を考えてみる /[々〆〇〻㐂-頻]+/g


本文がちょっと込み入っているので、まずは結果から書きます

今回書いた漢字を抽出する正規表現はこれ

/[々〆〇〻㐂-頻]+/g



調べてみると漢字の範囲は奥が深い

ひらがなやカタカナのように「ここからここまで」という始まりと終わりの文字がよくわからない

ひらがな:「あ」〜「ん」
カタカナ:「ア」〜「ン」
漢字:「?」〜「?」


今回調べて知ったこと・わかったこと等
  • 常用漢字やJIS第1水準〜第4水準の漢字を文化庁のホームページやwikipediaで知った
    (なんとなく知ってはいたが改めて調べて知った)
  • Unicodeは世界中の文字を1文字2バイトで65536字で表そうとしていた
    • でも65536字では足りないことに気づいた
  • 65536字では足りないので4バイトで1文字を表すサロゲートペアが作られた
  • 常用漢字の中で唯一のサロゲートペアは「𠮟」
    • ちなみに別の文字の「叱」は常用漢字ではないがJIS第1水準漢字
  • 今回書いた [㐂-頻] はJIS第1水準〜第4水準の漢字だけを絞っているわけではない
    • それ以外の漢字も範囲に含まれる
    • この範囲は個人的に絞ったものなので一般的ではない



今回書いた正規表現で一致させたい漢字
  • 㐂-頻の範囲に含まれるすべての漢字
    • 注意点としてはJIS第1水準〜第4水準の漢字だけではないということ
    • JIS第1水準〜第4水準の漢字を数値に置き換えて昇順に並び替えると先頭が 㐂 で末尾が 頻 ですが、その範囲内には第1〜第4に含まれない漢字も含まれる
    • サロゲートペアも含まれる
  • 々:上記の範囲に含まれないため直接追加
  • 〆:「しめ」「閉め」「締め」「絞め」「占め」などを表す
  • 〇:漢字のゼロ
  • 〻:現在は「々」で代用されることもある(上字の訓を繰り返す)

※JIS第1水準〜第4水準の漢字だけを抽出するにはこの正規表現では不十分です



Unicode 10.0 Character Code Charts
http://www.unicode.org/charts/ を見ると

2018/01/29現在以下のような種類があり今後ExtensionG以降も増えそう
  1. CJK Unified Ideographs (Han) Range: 4E00–9FEA 統一漢字
  2. CJK Extension-A Range: 3400–4DB5 拡張A
  3. CJK Extension B Range: 20000–2A6D6 拡張B
  4. CJK Extension C Range: 2A700–2B734 拡張C
  5. CJK Extension D Range: 2B740–2B81D 拡張D
  6. CJK Extension E Range: 2B820–2CEA1 拡張E
  7. CJK Extension F Range: 2CEB0–2EBE0 拡張F
  8. CJK Compatibility Ideographs Range: F900–FAFF 互換漢字
  9. CJK Compatibility Ideographs Supplement Range: 2F800–2FA1F 互換漢字補足
  10. CJK Radicals / KangXi Radicals Range: 2F00–2FDF 部首
  11. CJK Radicals Supplement Range: 2E80–2EFF 部首補足
  12. CJK Strokes Range: 31C0–31EF おそらく一画ごとの表
  13. Ideographic Description Characters Range: 2FF0–2FFF おそらく配置
CJKはChinese Japanese Koreanの頭文字


wikipediaでCJK統合漢字を見てみるとだいぶ複雑な歴史を経ている


16進数で表してみる


/[々〆〇〻㐂-頻]+/g



16進数で表す場合は、おそらくこのようになる

/[\u3005\u3006\u3007\u303b\u3402-\uFA6A\uD840-\uD869\uDC02-\uDFFF]+/g


それぞれの16進数が意味している文字は

3005:々
3006:〆
3007:〇
303B:〻
3402:㐂
FA6A:頻
D840:𠀋の上位サロゲート(範囲内のサロゲートペアの上位サロゲートで一番小さい)
D869:𪚲の上位サロゲート(範囲内のサロゲートペアの上位サロゲートで一番大きい)
DC02:𦐂の下位サロゲート(範囲内のサロゲートペアの下位サロゲートで一番小さい)
DFFF:𣟿の下位サロゲート(範囲内のサロゲートペアの下位サロゲートで一番大きい)


今回書いた正規表現を使って漢字を抽出してみる

コード.gs
function get_kanji(){
  var str = "abcABC123abcABC123かなカナカナ仮名ひらがなカタカナカタカナ漢字";
  var pattern = /[々〆〇〻㐂-頻]+/g;
  var result = str.match(pattern);
  Logger.log(result);
}
意訳
この機能がやること
探索対象の文字列を用意しておく
今回書いた漢字のパターン
一致するものを探して
ログに出す



実行結果




参考

Unicode 10.0 Character Code Charts
http://www.unicode.org/charts/


wikipedia
CJK統合漢字
https://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97

常用漢字一覧
https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7

漢字
https://ja.wikipedia.org/wiki/%E6%BC%A2%E5%AD%97


常用漢字表(平成22年内閣告示第2号)
http://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/kanji/


日本漢字能力検定
級別漢字表
http://www.kanken.or.jp/kanken/outline/data/outline_degree_national_list.pdf