4

文字列を指定すると、少なくとも3つの同一文字のシーケンスをチェックし、その文字の2つに置き換える正規表現を実装しようとしています。たとえば、次の文字列を有効にしたい:

sstttttrrrrrrriing

の中へ

ssttrriing 

…の線に沿って何かを考えています。

$string =~ s/(\D{3,})/substr($1, 0, 2)/e;

しかし、これは次の理由で機能しません。

  1. 3 つのアルファベット文字が同一かどうかはチェックしません。3 つ以上の異なる文字のシーケンスに一致できます。
  2. 最初の一致のみを置き換えます。この正規表現のすべての一致に対応する必要があります。

誰でも私を助けることができますか?

4

2 に答える 2

12

キャプチャ グループを使用して で後方参照し\1、その後 2 回挿入することができます。

$ perl -plwe 's/(.)\1{2,}/$1$1/g'
sstttttrrrrrrriing
ssttrriing

または、\K(keep) エスケープ シーケンスを使用して、再挿入する必要がないようにすることもできます。

s/(.)\1\K\1+//g

必要に応じて、ワイルドカード.を適切な文字 (クラス) に置き換えます。たとえば、文字の場合:

perl -plwe 's/(\pL)\1\K\1+//g'
于 2012-05-27T22:34:06.453 に答える
3
$ echo "sssssttttttrrrrriiiinnnnggg" | perl -pe "s/(.)\1+/\1\1/g"
ssttrriinngg
于 2012-05-27T22:41:57.490 に答える