日本語にマッチする正規表現って
簡体字やハングルにマッチしない正規表現ってどう書くんだろう。
$ echo -n e38392 e69db1 e4b89c 0a | xxd -p -r | perl -MEncode -pe '$_=decode_utf8($_);s/(\p{Han})/<$1>/g;$_=encode_utf8($_)' ヒ<東><东>
簡体字も 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 ビ ピ
お、ブログに貼り付けたら実態参照に変わっちゃった。じゃあ、
$ echo -n e38392 e38299 0a e38392 e3829a 0a | xxd -r -p| idn -s --quiet ビ ピ