正規表現で Unicode Block

そういや、Python正規表現エンジンって、named group は使えるけど、Unicode Block は使えないんだっけ? PerlJava なら Unicode Block が使える。

use strict;
use warnings;
use utf8;
use Perl6::Say;

binmode STDOUT, ':utf8';

my $target = "漢字正規表現亜腕一十百千万億兆京?";

my @patterns = (
    qr/[一-龠]/,
    qr/?p{InCJKUnifiedIdeographs}/,
    qr/?p{InCJKUnifiedIdeographs}|?p{InCJKUnifiedIdeographsExtensionA}|?p{InCJKUnifiedIdeographsExtensionB}/,
    qr/[?p{InCJKUnifiedIdeographs}?p{InCJKUnifiedIdeographsExtensionA}?p{InCJKUnifiedIdeographsExtensionB}]/,
);

say join ' ', split //, $target;
say '';
for my $re (@patterns) {
    say join ' ', $target =~ /$re/g;
}
import java.util.List;
import java.util.ArrayList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Kanji {
    public static void main(String[] args) {
        String target = "漢字正規表現亜腕一十百千万億兆京?";
        Pattern[] patterns = new Pattern[] {
            Pattern.compile("??p{InCJKUnifiedIdeographs}"),
            Pattern.compile("??p{InCJKUnifiedIdeographs}|??p{InCJKUnifiedIdeographsExtensionA}|??p{InCJKUnifiedIdeographsExtensionB}"),
            Pattern.compile("[??p{InCJKUnifiedIdeographs}??p{InCJKUnifiedIdeographsExtensionA}??p{InCJKUnifiedIdeographsExtensionB}]"),
        };

        for (String c : findAll(target, Pattern.compile("."))) {
            System.out.print(c + " ");
        }
        System.out.println();
        System.out.println();

        for (Pattern pattern : patterns) {
            Matcher matcher = pattern.matcher(target);
            for (String s : findAll(target, pattern)) {
                System.out.print(s + " ");
            }
            System.out.println();
        }
    }

    private static String[] findAll(String str, Pattern pattern) {
        int start = 0;
        Matcher matcher = pattern.matcher(str);
        List<String> list = new ArrayList<String>();
        while (matcher.find(start)) {
            list.add(matcher.group(0));
            start = matcher.end();
        }
        return list.toArray(new String[0]);
    }
}
% perl kanji.pl
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 ?

漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 ?
?
% javac -J-Dfile.encoding=UTF-8 -encoding UTF-8 Kanji.java
% java -Dfile.encoding=UTF-8 Kanji
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 ? 

漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 ? 
漢 字 正 規 表 現 亜 腕 一 十 百 千 万 億 兆 京 ? 

む。Perl で文字クラスを使った場合の挙動が変だなぁ。なんだろ。

追記

ぐ、「𪚲」がひどいことに。よく考えればはてなダイアリーの出力エンコーディングEUC-JP なんだから当たり前なんだけど。? になっているところは「𪚲」で読み替えてください。