But I like this one, so:
use v5.12; use warnings; my $re = templ2regex("Mississippi"); for my $inp (qw/Mississippi Mossossoppo Miiiiiiippi/) { if ( my @matches = ( $inp =~ /$re/ ) ) { say "Match: $inp re: $re" if is_uniq(@matches); } } # Mississippi -> (.)(.)(.)\3\2\3\3\2(.)\4\2 sub templ2regex { my ($template) = @_; my ( $re, %grp, $cnt ); $re .= $grp{$_} // do { $grp{$_} = "\\" . ++$cnt; "(.)" } for split //, $template; return $re; } # @_ elements all distinct? sub is_uniq { my %uniq; @uniq{@_} = (); return @_ == keys %uniq; }
=>
Match: Mississippi re: (.)(.)(.)\3\2\3\3\2(.)\4\2 Match: Mossossoppo re: (.)(.)(.)\3\2\3\3\2(.)\4\2
if you really want to have it all in one regex, consider putting the uniq test into a (?{...}) block which does a *FAIL
Both are not canonical regexes but IMHO far better to maintain.
Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery
refactoring: better documentation and variable names
In reply to Re^2: Nonrepeating characters in an RE
by LanX
in thread Nonrepeating characters in an RE
by BernieC
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |