On Thu, 9 Jan 2014 10:57:00 GMT, Peter Gordon wrote: >I'm trying do write a one line RE to strip sequence numbers off >filenames. The filename can may have: >No sequence numbers >or >Start with a variable number of digits, >Followed by an optional character between a and c >Followed by a compulsory - or _. >The characters - and _ can occur in the filename. > >In the code below, the first RE strips the "a" off apple but >by testing for digits first, this can be overcome. >Is there a RE which will remove the need for an if test? > >The @ar contains all variations of the filename. > >*** CODE *** >#!/usr/bin/perl -w >use 5.14.0; >my @ar = ( "1234_apple.mpg", >"1234-apple.mpg", >"123a_apple_a.mpg", >"1234a-apple-b.mpg", >"apple-a.mpg", >"apple_a.mpg", >"apple.mpg" >); >foreach ( @ar) { >(my $newname = $_) =~ s/(?:^\d+)* # match optional digits >(?:[a-c])* # match an optional alpha a to c. >(?:[-_]*)? # match the compulsory - or _ >(.*)/$1/x; # match the file name. >say "$_\t\t$1"; >} ># Two step RE. >say "\nTwo step RE\n"; >foreach ( @ar ) { >my $oldname = my $newname = $_; >if( $newname =~ s/^\d+(.*)/$1/ ) { >$newname =~ s/(?:[a-c])*(?:[-_])?(.*)/$1/; >} >say "$oldname\t\t$newname"; >} >
I have resolved the problem by using a look behind to try matching the range a to c. (?:[a-c])* # match an optional alpha a to c. becomes: (?:(?<=\d)[a-c])* # match an optional alpha a to c. This gives the required result. -- Peter Gordon, pete...@netspace.net.au on 01/09/2014 -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/