Unicode文字ポイントとUnicode文字クラスのプロパティ|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。Rubyを中心としながらも、なるべく一般的な形で正規表現を解説しています。誤りやお気づきの点がありましたら@hachi8833までどうぞ?。⚓Unicode文字コードポイントUnicode文字コードポイントの表記方法も、正規表現ライブラリによってまちまちです。そもそもUnicode文字コードポイントで表せない正規表現ライブラリもたまにあります。set)というものがあります。手元のかな漢字変換にある「文字パレット」を開くと、Unicodeの文字集合とそのコードポイントを見ることができます。U+00F9みたいなのがコードポイントで、16進数です。ここで重要なのは、コードポイントはUnicodeそのものの規格なので、エンコードがUTF-8だろうと16だろうと32だろうとコードポイントは変わらないという点です。U+00F9の00F9はUnicodeのどのエンコードでも同じです。Unicode文字コードポイントはほとんどが4桁です。後から足された文字の中にはコードポイントが5桁や6桁のものがあります。これがMySQLの有名な「寿司ビール問題」を引き起こしました。最近はUnicodeに絵文字が大量に追加されているので、これまでこの種の問題に関心が薄かった英語圏も絵文字の普及とともにやっと真剣に考えてくれるようになったのはありがたいことです。MySQLのencodingをutf8からutfmb4に変更して寿司ビール問題に対応する⚓正規表現でのコードポイント記法ここからが本題です。Unicodeの規格ではU+00F9というような表記が用いられていますが、正規表現ライブラリ(というよりライブラリを使うプログラミング言語)によって表記方法はまちまちです。以下はほんの一例です。基本形\uFFFFRubyなど[\u{FFFF}]、[\uFFFF]、\uFFFF、\u{FFFF}JavaScript、Pythonなど[\uFFFF]、\uFFFFPCRE、Perl、Golangなど[\x{FFFF}]、\x{FFFF}POSIX基本(機能なし)HTMLやXML(参考)&#xFFFF;Rubyは{}があってもなくても許容しますJavaScriptやPythonは{}を許容しませんPCRE/Perl/Golangは{}が必須ですつまり、たとえばPythonとPerlの両方で同じ正規表現を動かそうとするとここが最も移植の障害になります?。]の中に入れて書くのが好みです。次に説明するUnicode文字クラスと書式が揃って気持ちいいという理由です。コードポイント記法を無理して使うことはないそして意外に思われるかもしれませんが、私はそもそも[\uFFFF]のようなコードポイント記法をほぼまったく用いません。主な理由は上のように言語/ライブラリでの非互換性が大きいということと、コメントなしでは意味不明になりがちな視認性の悪さです。私は正規表現のメンテナンス性を重視するので、一度書いたら忘れてもいい正規表現ならともかく、後で細かく調整する正規表現は未来の自分が読んでくじけない書き方を常に目指しています。]の中に文字を直接書きます。円周率なら3.1415926535897932384626までは覚えちゃいましたが。]の中に安心して書けます。内でエスケープしなくてもよい記号ただ、特に[-ー-─―‐]のような「ハイフンと紛らわしい文字のセット」のような正規表現では、本来の-(U+002D、ASCIIだと2D)を文字セットの冒頭または末尾以外には置かないよう心がけています。-を途中に置くと「両側の文字の範囲」になってしまうので。一部の結合文字のように、エディタやIDEやターミナルで入力すると挙動がおかしくなる特殊な文字があります。いう場合には、仕方なくコードポイントで書くこともあります。⚓Unicode文字クラスのプロパティUnicode文字クラスのプロパティは、\p{なんちゃら}という形で表記します(pはプロパティのことでしょうね)。マルチリンガルな正規表現で非常に有用性が高いのが特徴です。これが使えるライブラリは高機能と認めてよいと思います。JavaScriptなど?(ただしついにES2018で導入される予定❤️)\p{なんちゃら}は比較的最近の機能であるためか、文字コードポイントなんかと違って、主要な言語での記法のブレが少ないのがありがたい点です?。\p{なんちゃら}の「なんちゃら」の部分には、以下の3種類を指定できます。categories(一般カテゴリとも)[\p{L}](記号/約物/スペースでない)あらゆる文字(letter)、[\p{Zs}](スペース)、[\p{N}](あらゆる数字)、[\p{No}](漢数字や1などの数字)など上の表のリンクをクリックすると、それぞれの全リストを参照できます。一般カテゴリは、上のリンク先の表では大文字1文字(カテゴリ)と小文字1文字(サブカテゴリ)の組み合わせがリストアップされています。大文字の[\p{N}]とすると、[\p{Nd}](数値用の数字)と[\p{Nl}](ローマ字などの数字)と[\p{No}](漢数字や分数などの数字)といったサブカテゴリを一発で表せるので便利です。Ideographsなどと書かれていたりするので、自分でIn_を付けたりスペースを_に置き換えるなどしてIn_CJK_Unified_Ideographsのような形にする必要があります。Unicode文字クラスで言う文字(letter)は「記号やスペースといった約物(punctuation)や数値(number)などでないもの」という補集合的な意味で捉える必要があります。[\p{L}]や[\p{N}]のような一般カテゴリは、マッチする範囲が非常に大きいので注意が必要です。余分なマッチを呼び込んでいないか、使う前によーくチェックしましょう。[\p{L}]は日本語だろうがトンパ文字だろうがあらゆる言語のあらゆる文字(letter)にマッチします。[\p{N}]は全角数字だろうがローマ字のVIだろうが分数1⁄4だろうが数字という数字にマッチします。漢数字は「〇」以外はマッチしません(Rubular)。漢数字は数字ではなく文字として扱われます。逆に、[\p{Zs}]はありとあらゆるスペース文字にマッチするので、ゼロ幅スペースのようないたずらにしか使えないようなスペース文字すら捉えられます。うまく使えば非常に有用です。カタカナにマッチさせたい場合、たとえば[\p{Katakana}]+だけでは長音ーが含まれないので注意が必要です。[\p{Katakana}ー]+などのように長音も忘れず含めましょう。厳密にやるなら[\p{Katakana}][\p{Katakana}ー]+のように冒頭の長音を排除したいところです。通常の全角カタカナの他に半角カタカナにもマッチさせたいなら、/[\p{Katakana}ーー゙゚]+/のように半角の濁点と半濁点と長音ー゙゚も加える必要があります(Rubular)。半角の濁音と半濁音は、前の文字に貼り付く特殊な文字につき単独ではコピペ困難な可能性があります。以下をお使いください。私は日本語を相手にする正規表現をよく使います。その中で多用している有用な文字クラスは、[\p{Han}]+(漢字にマッチ)、[\p{Hiragana}]+(ひらがなにマッチ)[\p{Katakana}ー]+(カタカナにマッチ)の3つです。/[\p{Katakana}ー]+/でカタカナにマッチ(Rubular)これらは誤動作の心配もなく、#3で紹介したような[一-龠]や[ぁ-ん]といった文字セットよりずっと洗練されています。私にとって、ないと生きていけない機能であり、これらが使えない正規表現ライブラリに用はありません。文字セット同士の差分を取れると、正規表現を簡潔に書くうえで非常に有用です。詳しくは以下の記事をご覧ください。正規表現ってちょっと覚えるだけでなく書き方が変わるので、いざ必要になった時に思い出せるように記憶の片隅に入れておきたい。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。