[Perl6]Unicodeプロパティを使って半角・全角の文字にマッチする正規表現を書く
Perl6で全角文字にマッチする正規表現を書いたり、特定の文字の「幅」を調べる方法です。具体的にはUnicodeのEast_Asian_Width
というプロパティを調べることで半角・全角を判断します。
Unicodeプロパティを表示するにはuniprop
メソッドを使います。
以下のコードでは文字列を1文字ずつに分解し、East_Asian_Width
プロパティを表示します。
for "aaAÅÆ??++22Ⅱあ漢カ㍍".comb -> $char { say $char => $char.uniprop("East_Asian_Width"); }
以下が実行結果です。半角英数字・記号はNa
、全角英数字・記号はF
、ひらがなや漢字はW
、それ以外はN
やA
、半角カタカナはH
となりました。通常の全角日本語であればF
とW
にマッチさせればよさそうです。
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_Width
はea
という省略形があるので以下のように書けます。
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」)