masato日記

勉強ノート

Perlで正規表現を使って日本語の文字列にマッチさせる

やりたいこと

日本語の文字列に含まれる任意の箇所にマッチさせたい。

はまったこと

()をエスケープすることを忘れていた。

use Encode qw/encode/;

# source text
my $str = 'メッセージ "通信エラー"が表示されます。';
my $p = '通信エラー';

$p = encode('utf8', $p);
$str = encode('utf8', $str);

if ($str =~ m/$p/) { # マッチをトライ
    print "Found it!!!";
}

ここで小1時間ほど悩んだ。

解決策が思い当たらなかったのでTeratailのプロに質問して解決した。

文字列が含まれるかどうかを判定するのにはindex関数が使える。 メタ文字をエスケープするには、\を前に入れてもよいが、quotemetaするといい具合ににエスケープしてくれるので便利。

binmode STDOUT, ':utf8'; #標準出力を自動的にutf8にする

## index function
if (index($str, $p) >=0) {
    print "Found it!!!\n";
}

## quotemeta
my $qp = quotemeta $p;
if ($str =~ s/$qp/Communication fault/) {
    print "Replaced: $str\n";
}