正規表現で全角文字(ひらがな・かたかな・漢字、記号など)、半角カタカナをマッチさせる
#!/usr/bin/env perl use strict; use warnings; use Encode; use utf8; # 全角文字、全角記号、全角英数字、半角カナを含めている my $strings = "Aあb漢Cイd字0ギ-ャ1ゃ213=~3\\^_%―$\"#\tわ\n−Z"; my @chars = split '', $strings; my $utf8 = find_encoding('utf8'); my $regex_hiragana = qr/(\p{InHiragana})/; my $regex_katakana = qr/(\p{InKatakana})/; my $regex_jpn_kanji = qr/(\p{InCJKUnifiedIdeographs})/; my $regex_hankaku = qr/(\p{InHalfwidthAndFullwidthForms})/; # 半角カナ、全角英数などマッチ my $regex_numeric = qr/(\d)/; my $regex_latin = qr/(\p{Latin})/; # 全角半角英字にマッチ my $regex_alphabetical = qr/([A-Za-z])/; my $regex_control_char = qr/(\s)/; my $regex_zenkaku_control_char = qr/(\p{InCJKSymbolsAndPunctuation})/; # 全角記号にマッチ foreach my $char (@chars) { if ($char =~ $regex_hiragana) { # ひらがな print 'Hiragana: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_katakana) { # かたかな print 'Katakana: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_jpn_kanji) { # 漢字 print 'JPN Kanji: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_zenkaku_control_char) { # 全角記号 print 'Zen Ctr Char: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_latin) { # 全角半角英字 } elsif ($char =~ $regex_hankaku) { # 半角カナ、全角英数など print 'Hankaku: ' . $utf8->encode($1), "\n"; print 'Zen Alpha Char: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_numeric) { # 半角数字 print 'Numeric: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_alphabetical) { # 半角英字 print 'Alphabet: ' . $utf8->encode($1), "\n"; } elsif ($char =~ $regex_control_char) { # 制御文字 print 'Control char: ' . $utf8->encode($1), "\n"; } else { # その他 print 'Other char: ' . $utf8->encode($char), "\n"; } }
出力結果をみると、Unicode Block (ユニコードブロック) で指定する範囲が重なっている文字があり、制御文で判定させる順番に留意した方がよさそう。
Hiragana: あ JPN Kanji: 漢 Katakana: イ JPN Kanji: 字 Numeric: 0 Hankaku: キ Zen Alpha Char: キ Hankaku: ゙ Zen Alpha Char: ゙ Other char: - Hankaku: ャ Zen Alpha Char: ャ Numeric: 1 Hiragana: ゃ Numeric: 2 Hankaku: 1 Zen Alpha Char: 1 Numeric: 3 Other char: = Other char: ~ Hankaku: 3 Zen Alpha Char: 3 Other char: \ Other char: ^ Other char: _ Other char: % Other char: ― Control char: Other char: # Control char: Hiragana: わ Control char: Hankaku: − Zen Alpha Char: −