これには、置換コマンドで「実行」オプションが必要なようです。そのため、置換テキストは Perl コードのフラグメントとして扱われます。
$str =~ s/((.)\2+)/$2 . length($1)/ge;
脚本
#!/usr/bin/env perl
use strict;
use warnings;
my $original = "aaabbcccdddd";
my $alternative = "aaabbcccddddeffghhhhhhhhhhhh";
sub proc1
{
my($str) = @_;
$str =~ s/(.)\1+/$1/g;
print "$str\n";
}
proc1 $original;
proc1 $alternative;
sub proc2
{
my($str) = @_;
$str =~ s/((.)\2+)/$2 . length($1)/ge;
print "$str\n";
}
proc2 $original;
proc2 $alternative;
出力
abcd
abcdefgh
a3b2c3d4
a3b2c3d4ef2gh12
正規表現を分解して、それがどのように機能するかを説明していただけますか?
問題があるのは交換部品ではなく、適合部品だと思います。
元の正規表現は次のとおりです。
(.)\1+
(.)
これは、同じ文字が 1 回以上繰り返される単一の文字をキャプチャします。
改訂された正規表現は「同じ」ですが、パターン全体もキャプチャします。
((.)\2+)
最初の開き括弧は、全体のキャプチャーを開始します。2 番目の開き括弧は、1 文字のキャプチャを開始します。ただし、現在は 2 番目のキャプチャであるため、\1
オリジナル\2
の はリビジョンである必要があります。
検索では繰り返される文字の文字列全体がキャプチャされるため、置換によってパターンの長さを簡単に判断できます。