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