Perlの正規表現で文字列マッチを繰り返し判定する方法
Perlの正規表現で文字列マッチを繰り返し判定する方法を紹介します。
また、特定の繰り返し回数のみ文字列を置換する方法もあわせて紹介します。
1.問題点
Perlで文字列の一括置換を行う場合は、s///演算子にgオプションをつけることで簡単に実現できます。
#!/usr/bin/
use strict;
my $content = "123abc456abc789abc";
$content =~ s/\d{3}/xyz/g;
print $content;
実行結果
xyzabcxyzabcxyzabc
が、文字列マッチを繰り返し判定する方法が分かりません。
2.文字列マッチを繰り返し判定する
文字列マッチを繰り返し判定するには、パターンマッチ演算子「//」にgオプションを与え、さらにwhile文を組み合わせます。
#!/usr/bin/
use strict;
my $content = "123abc456abc789abc";
while ( $content =~ /\d{3}/g ) {
print "$&\n";
}
実行結果
123
456
789
「$&」は最後に成功したパターンマッチでマッチした文字列が保持される特殊変数です。
3.特定の回のみ置換する
1項の応用で、特定の回のみ置換するには次のようにします。
ここでは2回目にマッチした文字列を「xyz」にします。
#!/usr/bin/perl
use strict;
my $content = "123abc456abc789abc";
my $counter = 1;
while ( $content =~ /\d{3}/g ) {
if ( $counter == 2 ) {
$content =~ s/($`)$&($')/$1xyz$2/;
}
$counter++;
}
print $content;
実行結果
123abcxyzabc789abc
$`は$&の前方の文字列、$'は$&の後方の文字列が保持される特殊変数です。
よりエレガントな方法がありそうな気がしますがとりあえず。
4.文字列マッチの回数だけをカウントする
文字列マッチの回数をカウントするには次のようにします。
#!/usr/bin/
use strict;
my $content = "123abc456abc789abc";
my $count = 0;
$count++ while $content =~ /\d{3}/g;
print $count;
実行結果
3
2項のようにwhile文をブロックで括り、その中で$counterをインクリメントしてもOKです。
2014.11.24追記
ぴろりさんが下記の記事をアップくださいました。
Re: Perlの正規表現で文字列マッチを繰り返し判定する方法
Posted by yujiro このページの先頭に戻る
- Perlの正規表現で条件分岐する方法
- 正規表現の最短マッチと最長マッチについて
- Perlの正規表現で繰り返し置換する方法
- Perlの正規表現で複数行にマッチさせる方法
- Perlの正規表現で制御文字を削除する
トラックバックURL
コメントする
greeting