さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

Unicodeで正規表現検索

use utf8で挙動が変わるPerl正規表現

言うまでもないかもしれませんが、Perlでは正規表現が利用できます。「\d」では半角数字が、「\w」で半角英数字が検索できるという便利な検索の仕組みのことです。
詳しいことは下記のサイトをご参照あれ。Perl正規表現について詳細に解説してくれています。

正規表現 | Smart -Web Magazine

さて、「\d」「\w」のメタ文字は、先述の通り半角数字、半角英数字にそれぞれマッチします。

メタ文字 説明
\d 数字の1文字にマッチ
[0-9] と同じです。
\w アルファベットまたは数字(単語)の1文字にマッチ
[a-zA-Z_0-9] と同じです。

ところが、Perlスクリプト内でutf8プラグマを記入しておくと、ちょっと違う動作を行いました。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use feature qw/say switch/;

use open IO => qw/:utf8 :std/;

$_ = "Androidマーケットのアプリを, 10〜20インストール。";

my @eisu = m|\w|g;
my @suji = m|\d|g;

say '@eisu'; say @eisu;
say '@suji'; say @suji;

このスクリプトを実行してみると、
f:id:takepierrot:20111229110315p:image
「\w」がいろんな文字にヒットしちゃってますね。句読点、カンマなどの約物やスペース、それに記号は弾いてくれるようですが、それ以外の全半角カタカナ、ひらがな、全半角英数字は該当するようです。
「\d」も全半角の数字にヒットしています。

多機能すぎて不便に……?

これは、こういう状態になることをわかって使う分には便利ですが、半角英数字だけがほしいというときにはかえって困りものです。
正確に半角数字だけがほしいときは「[0-9]」、半角英字がほしいときは「[a-zA-Z]」みたいに書いておいた方がよさそうです。ほかにも解決方法はありそうですが……。