Top image

Perl Monk

主にPerlとRaspberryPiの個人的技術研鑽

Perl小ネタ:正規表現でマッチした分割単位をそのまま配列に格納する方法

2019/06/20 20:00
category:Perl

正規表現でマッチしたものを変数にいれる

まず、マッチしたものを変数に代入できるというのがあります。

my $string = '1234567890abcdefg';
my @array = $string =~ /[0-9]+/g;
foreach ( @array ) {
	print "$_\n";
}

出力

1234567890

正規表現で()で区切ったものを分割して配列に入れる

いちいちsplit関数を使わなくてもいいので、文字列処理に個人的にはよく使う手法です。

my $string = 'aaa[bbb]ccc';

という文字列があり、カッコ内でくくった文字やその前後を配列に格納する場合

my @word_array = $string =~ /(.*)\[(.*)\](.*)/g;
print "word0:$word_array[0]\n";
print "word1:$word_array[1]\n";
print "word2:$word_array[2]\n";
word0:aaa
word1:bbb
word2:ccc

となります。

注意点としては、特に指定がない場合最長マッチになるようです。

デフォルト

my $string = 'aaa[bbb]ccc]ddd';
my @word_array = $string =~ /(.*)\[(.*)\](.*)/g;
print "word0:$word_array[0]\n";
print "word1:$word_array[1]\n";
print "word2:$word_array[2]\n";
word0:aaa
word1:bbb]ccc
word2:ddd

?を付けて最小マッチさせる

最短でマッチさせる場合、.*や.+に?を付けて最短マッチさせます。

my $string = 'aaa[bbb]ccc]ddd';
my @word_array = $string =~ /(.*)\[(.*?)\](.*)/g;
print "word0:$word_array[0]\n";
print "word1:$word_array[1]\n";
print "word2:$word_array[2]\n";
word0:aaa
word1:bbb
word2:ccc]ddd