#!/usr/bin/perl use strict; use warnings; $_ = 'testing 1234567 ........ aaaaaaaasssssss __________ ++++++++++ - +-------- testing testing '; s/((.)\2\2)\2*/$1/g; print;
to output
testing 1234567 ... aaasss ___ +++ --- testing testing
YAPE::Regex::Explain describes the regex as:
( group and capture to \1: ---------------------------------------------------------------------- ( group and capture to \2: ---------------------------------------------------------------------- . any character except \n ---------------------------------------------------------------------- ) end of \2 ---------------------------------------------------------------------- \2 what was matched by capture \2 ---------------------------------------------------------------------- \2 what was matched by capture \2 ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- \2* what was matched by capture \2 (0 or more times (matching the most amount possible))
Note I have kept the third 'testing' in the string, which seems to follow spec but not your example.
Update: As AnomalousMonk points out below, swapping \2* to \2+ is more rigorously correct and avoids some unnecessary no-ops. However, I didn't think this particular optimization was likely to have sufficient impact to warrant changing the post content. For a cleaner version, you can also use s/(.)\1{3,}/$1 x 3/eg; (or s/(.)\1{$n,}/$1 x $n/eg;).
In reply to Re: Supress similar chars in the string
by kennethk
in thread Supress similar chars in the string
by Lana
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |