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/


Reply via email to