漢字、ひらがな、カタカナにマッチ

漢字などにマッチさせるには、対象とする文字コードや使用する処理系によって、異なるアプローチをとる必要があります。

文字コードがUnicode

Unicodeプロパティのスクリプトがサポートされているならば、それを使用します。

文字種 メタ文字
ひらがな \p{Hiragana}
カタカナ \p{Katakana}
漢字 \p{Han}

Unicodeプロパティ (Unicode property)

  • プロパティ
    • 一般プロパティ \p{L}など
    • サブプロパティ \p{Ll}など
  • スクリプト \p{Han}など
  • ブロック \p{Tibetan}など

一般プロパティは、一部の実装では波かっこ ({}) なしで参照できます。たとえば\p{L}\pLとなります。

Unicodeプロパティがサポートされない場合

文字クラスで、文字が定義されているコードの範囲を指定します。このときShift_JISなどの[亜-熙]では不十分で、Unicodeブロックの範囲を指定する必要があります。

漢字

  • 表記1 … [々〇〻\u3400-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]
  • 表記2 … [々〇〻\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}]|[\x{D840}-\x{D87F}][\x{DC00}-\x{DFFF}]
Unicodeで「漢字」の正規表現 – ものかの

それぞれの文字の範囲は、以下のUnicodeブロックを表します。

  • \u3400-\u9FFF
    • U+3400 ~ U+4DBF … CJK Unified Ideographs Extension A
    • U+4DC0 ~ U+4DFF … Yijing Hexagram Symbols
    • U+4E00 ~ U+9FFF … CJK Unified Ideographs
  • \uF900-\uFAFF
    • U+F900 ~ U+FAFF … CJK Compatibility Ideographs
  • [\uD840-\uD87F][\uDC00-\uDFFF]
    • U+D840 U+DC00 … サロゲートペアによるU+20000
    • U+D87F U+DFFF … サロゲートペアによるU+2FFFF
      • U+20000 ~ U+2FFFF … CJK Unified Ideographs Extension B ~ E、CJK Compatibility Ideographs Supplement

文字コードがShift_JIS

JIS規格により文字集合が並んでいることを利用し、文字クラスの範囲指定を利用します。文字コード表 シフトJIS(Shift_JIS)

文字種 文字クラス
ひらがな [ぁ-ん]
カタカナ [ァ-ヶ]
漢字 [亜-熙]※1
上記すべて [ぁ-んァ-ヶ亜-熙]

※1 第1水準と第2水準の漢字のみ。これ以外は実装依存で、たとえば文字コードがCP932ならば、纊-黑を追加する。

マルチバイト文字が認識されない場合

先頭と末尾の文字を文字コードで指定し、文字クラスの範囲指定を利用します。

Shift_JIS
文字種 正規表現
ひらがな \x82[\x9f-\xf1]
カタカナ \x83[\x40-\x96]
漢字 [\x88-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]※1
上記すべて [\x82-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]
※1 厳密な範囲ではなく、漢字以外も含まれます。

これはそれぞれ文字コードの最初と最後の文字を指定していて、文字と文字コードは

  • ひらがな
    • ぁ … 0x829f
    • ん … 0x82f1
  • カタカナ
    • ァ … 0x8340
    • ヶ … 0x8396
  • 漢字
    • 亜 … 0x889f
    • 熙 … 0xeaa4 (これより後には、実装依存の文字が定義される)

のような対応となっています。全角文字については、文字コード表の全角文字が定義されている範囲をすべて含むように指定しています。文字コード表 シフトJIS(Shift_JIS)

ASCII文字以外にマッチ

[\x00-\x7F]で、すべてのASCII文字にマッチします。これの否定の[^\x00-\x7F]とすることでASCII文字以外、つまり全角文字にマッチさせることができます。

漢数字にマッチ

漢数字は文字コードの順に並んでいないため、半角の数字のように範囲指定で[〇-九]のようにはできません。よってマッチさせるすべての文字を、[〇一二三四五六七八九]のように並べることで対処します。

参考

参考書