s/([^[:^alpha:]nN])([\dnN]+\1)/_$1$2_/g; s/__/_/g;
Update: Ah, you had more specs hidden in your code block (and roughly that solution, except without the double-^ trick that I like). You can't use things like \3 in a character class, even if you don't try to use them out-of-order. I'll take a stab later. Update:
my $string = '423RY75Y69827EC67592C78657N965R345U299M'; my $correct= '423R_Y75Y_69827E_C67592C_78657N965R_345U_299M'; for( $string ) { s/([^[:^alpha:]nN])([\dnN]+\1)/_$1$2_/g; s/(?<=([^\dnN_]))?([\dnN]+)([^\dnN_])/ $2 . $3 . ( $1 eq $3 ? '' : '_' ) /ge; s/_(_|$)/$1/g; } print "Okay\n" if $string eq $correct;
Add "defined $1 &&" or "no warnings 'uninitialized'" to avoid a warning, if you need to.
- tye
In reply to Re: match if last char and first char are different excluding certain chars (^.^)
by tye
in thread match if last char and first char are different excluding certain chars
by leocharre
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |