正規表現で Unicode Block
そういや、Python の正規表現エンジンって、named group は使えるけど、Unicode Block は使えないんだっけ? Perl や Java なら 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 で文字クラスを使った場合の挙動が変だなぁ。なんだろ。