実録コンピュータ物語

趣味で使っているコンピュータ&アプリの情報を発信するブログです。

[Perl6]Unicodeプロパティを使って半角・全角の文字にマッチする正規表現を書く

Perl6で全角文字にマッチする正規表現を書いたり、特定の文字の「幅」を調べる方法です。具体的にはUnicodeEast_Asian_Widthというプロパティを調べることで半角・全角を判断します。

Unicodeプロパティを表示するにはunipropメソッドを使います。 以下のコードでは文字列を1文字ずつに分解し、East_Asian_Widthプロパティを表示します。

for "aaAÅÆ??++22Ⅱあ漢カ㍍".comb -> $char {
    say $char => $char.uniprop("East_Asian_Width");
}

以下が実行結果です。半角英数字・記号はNa、全角英数字・記号はF、ひらがなや漢字はW、それ以外はNA、半角カタカナはHとなりました。通常の全角日本語であればFWにマッチさせればよさそうです。

a => Na
a => F
A => Na
Å => N
Æ => A
? => Na
? => F
+ => Na
+ => F
2 => Na
2 => F
Ⅱ => A
あ => W
漢 => W
カ => H
㍍ => W

Perl6の正規表現Unicodeプロパティを使うには<:プロパティ名>という形式を使用します。また、+で連結することで文字集合を合成できます。

さらに、East_Asian_Widtheaという省略形があるので以下のように書けます。

my $str = "はいおgふrtjrtw吸うrwぇjおare+JerOwHr歩wえwgweおぐぇいおhio";

# 全角文字にマッチ
say $str ~~ m:global/ <:ea('W')+:ea('F')>+ /;
# 出力:(「はいおgふ」 「吸う」 「ぇ」 「お」 「+」 「歩」 「え」 「おぐぇいお」)

# 半角文字にマッチ
say $str ~~ m:global/ <:ea('Na')>+ /;
# 出力:(「rtjrtw」 「rw」 「j」 「are」 「JerOwHr」 「w」 「wgwe」 「hio」)

参考情報