Practice of Programming

プログラム とか Linuxとかの話題

Unicodeブロックを組み合わせて正規表現で使う

Unicodeブロック使おうと思ってググってたら。

\p{InHalfwidthAndFullwidthForms} # 半角カナなど(※0-9とかA-Zにもマッチするみたい・・)

http://blog.livedoor.jp/sasata299/archives/51194035.html

あら、そうなんだ。

perldoc unicodeを読み直すと、Unicodeブロックを組み合わせてユーザー定義の文字プロパティ(User-Defined Character Properties)を作れると書いてあった。In/Isから始まる次のような関数を定義する。

package Hoge;
sub InHankakuKana {
    return <<'END';
+utf8::InHalfwidthAndFullwidthForms
-utf8::N
-utf8::Ll
-utf8::Lu
END
}

これで、Hoge::InHankakuKana を\p{}/\P{}に使えるようになる。
この定義では"-"から始まる部分で、数字と英語の大文字小文字を削除している(他の適切なブロックがあるかもしれないけど)。

my $str = "はひふへほハヒフヘホABC0-9とかA-Z";

my @m = $hoge =~m{(\p{InHalfwidthAndFullwidthForms})}g;
print join " - ", @m;
print "\n";

my @m = $hoge =~m{(\p{Hoge::InHankakuKana})}g;
print join " - ", @m;
print "\n";

結果は以下のようになる。

ハ - ヒ - フ - ヘ - ホ - 0 - 9 - A - Z
ハ - ヒ - フ - ヘ - ホ

後者では、ちゃんと、0-9 A-Zは除かれています。

perldoc unicode の "User-Defined Character Properties" に書いてあります。
http://perldoc.jp/docs/perl/5.10.0/perlunicode.pod