Perlの正規表現で文字列マッチを繰り返し判定する方法

Perlの正規表現で文字列マッチを繰り返し判定する方法

Posted at November 21,2014 1:55 AM
Tag:[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の正規表現で文字列マッチを繰り返し判定する方法

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)