in reply to match if last char and first char are different excluding certain chars

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        

Replies are listed 'Best First'.
Re^2: match if last char and first char are different excluding certain chars (^.^)
by leocharre (Priest) on Nov 04, 2006 at 00:54 UTC

    That's pretty wild. It actually works too. When I started perl, this is the kind of code I would look at and think to myself.. 'what th...'. It's hurting me a little bit right now. I have to zone to see it.

    Nice code, man.