Unicodeプロパティ

Unicodeは文字エンコーディングの一種ですが文字の性質も定義されています。ここで言う性質とは例えば大文字だとか数字だとか記号といったものです。Unicodeをサポートしている正規表現ではこのような性質を使ってマッチさせることが出来ます。(と、思ったけどPythonは対応してなかった。実はあんま使えない?)また、これら性質のことをUnicodeプロパティとか呼ぶようです。早速、サンプルをこさえて実験です。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string args)
    {
        string s = "Japan日本にほんニホン+−×÷√∫ΔΣ零壱弐参456789";
        Regex re = new Regex[] {
                new Regex(@"(?#小文字)\p{Ll}"),
                new Regex(@"(?#大文字)\p{Lu}"),
                new Regex(@"(?#漢字)\p{IsCJKUnifiedIdeographs}"),
                new Regex(@"(?#ひらがな)\p{IsHiragana}"),
                new Regex(@"(?#カタカナ)\p{IsKatakana}"),
                new Regex(@"(?#数学記号)\p{Sm}"),
                new Regex(@"(?#数字)\p{Nd}")};
        Console.WriteLine(s);
        foreach (Regex r in re)
        {
            Console.Write(r.ToString() + ":");
            foreach (Match m in r.Matches(s))
                Console.Write(m.Value);
            Console.WriteLine();
        }
        Console.ReadLine();
    }
}

/* 結果
Japan日本にほんニホン+−×÷√∫ΔΣ零壱弐参456789
(?#小文字)\p{Ll}:apan
(?#大文字)\p{Lu}:JΔΣ
(?#漢字)\p{IsCJKUnifiedIdeographs}:日本零壱弐参
(?#ひらがな)\p{IsHiragana}:にほん
(?#カタカナ)\p{IsKatakana}:ニホン
(?#数学記号)\p{Sm}:+×÷√∫
(?#数字)\p{Nd}:4566789*/

結果をみてちょっと首をかしげました。概ねあってはいるのですが、Δ(デルタ)やΣ(シグマ)が大文字だったり、−(マイナス)が数学記号にマッチしなかったりするのが謎です。NETのバグ?*1PerlとかJavaではどんな結果になるんだろう・・・

*1:VC#2005βでテストしています。