日本語にマッチする正規表現って

簡体字やハングルにマッチしない正規表現ってどう書くんだろう。

$ echo -n e38392 e69db1 e4b89c 0a | xxd -p -r | perl -MEncode -pe '$_=decode_utf8($_);s/(\p{Han})/<$1>/g;$_=encode_utf8($_)'<><&#19996;>

簡体字も Han script に含まれるよなあ。

MODULE.JP - 日本語に絡むUnicodeブロックとスクリプト(正規表現)によると

ちなみにUnicode関連のドキュメントによるとUnicodeプロパティとスクリプトで日本語の文章を表そうとすると

m/(?:(?:\p{Hiragana}|\p{Katakana}|\p{Han}|\p{Latin}|\p{Common})
  (?:\p{Inherited}|\p{Me}|\p{Mn})?)+/x;

こんな感じになるそうな。

だそうな。Common って property は、perlunicode - Perl における Unicode サポート - perldoc.jpによれば

Common      =  Any character (or unassigned code point)
                   not explicitly assigned to a script

Me は EnclosingMark (囲みマーク)、Mn は NonSpacingMark (前進を伴わない記号)。

perl5.8のUnicodeサポート によれば、

\p{Han}も追加すれば,記号を除いた日本語の文字列にマッチする正規表現が書けます.
sub InJapanese {
    return <<'END';
+utf8::InHiragana
+utf8::InKatakana
+utf8::Han
END
}

print $_,"\n" for $string =~ /(\p{InJapanese}+)/g;

だそうな。

うう、ダメだ深すぎる。今日はこれくらいで撤退。

追記 2010-01-24

手元に perl 5.8.9 のソースがあるから覗いてみた。perl-5.8.9/lib/unicore/Scripts.txt を見てみると、Common script は記号とか言語にあまり依らずに使われるものみたい。Inherited は他の字に付属的につく記号の類のようで、日本語では U+3099 の COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK (濁音記号) と U+309a の COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK (半濁音記号) かな。

]$ echo -n e38392 e38299 0a e38392 e3829a 0a | xxd -r -p
ヒ&#12441;
ヒ&#12442;

お、ブログに貼り付けたら実態参照に変わっちゃった。じゃあ、

$ echo -n e38392 e38299 0a e38392 e3829a 0a | xxd -r -p| idn -s --quiet
ビ
ピ