Forum: Ruby Regular Expression Trouble

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Chris H. (Guest)
on 2008-12-26 18:41
Hey!

I'm writing a little script to rename files with weird names but common
bits to a common format. Here's the regular expression I use to extract
the common data:

/.*s?(\d?\d)x?e?(\d\d).*\.(\w{3})$/i

It's meant to rename TV Show files, both video and subtitles. I'm having
trouble making it match the first group however. One of the digits
should be optional, so I stuffed a ? sign there. However, it only
matches one digit, leaving strings like 12x14 with captures ["2", "14"].

I'm not quite sure if there's anything wrong with my expression there,
but I'd swear it's the way to do it. Maybe you're able to see something
I'm looking past.

Thanks!
Dave T. (Guest)
on 2008-12-26 18:56
(Received via mailing list)
On Dec 26, 2008, at 10:41 AM, Chris H. wrote:

>
> /.*s?(\d?\d)x?e?(\d\d).*\.(\w{3})$/i
>
> It's meant to rename TV Show files, both video and subtitles. I'm
> having
> trouble making it match the first group however. One of the digits
> should be optional, so I stuffed a ? sign there. However, it only
> matches one digit, leaving strings like 12x14 with captures ["2",
> "14"].

Your problem is that .* is swallowing as many characters as it can. In
this case, it is swallowing up to and including the '1'. It then
stops, because you've said you need at least one digit before the 'x',
and that's the second \d.

If you change it around to

   /.*(\d\d?)x/

it should work. Note that I've also removed the s?, as that can never
actually be used—the .* will swallow the 's'.


Regards


Dave T.
Tim G. (Guest)
on 2008-12-26 19:25
(Received via mailing list)
Chris H. wrote:

> digits should be optional, so I stuffed a ? sign there. However, it
> only matches one digit, leaving strings like 12x14 with captures ["2",
> "14"].
>
> I'm not quite sure if there's anything wrong with my expression there,
> but I'd swear it's the way to do it. Maybe you're able to see
> something I'm looking past.
>
> Thanks!

.* should probably be set to non greedy .*?, so it doesn't grab things
you don't want.

/.*?s?(\d?\d)x?e?(\d\d).*?\.(\w{3})$/i

What exactly does the data you're pulling the digits and 3 letter file
extension from look like?
Magnus Erickson (Guest)
on 2008-12-26 19:39
(Received via mailing list)
Howdy!

I've used www.rubular.com when fiddling around with Ruby regular
expressions.
It will show matches in real time as you type on an arbitrary text. It
helped me a lot.

    Magnus

________________________________________
Från: removed_email_address@domain.invalid 
[removed_email_address@domain.invalid]
Skickat: den 26 december 2008 17:41
Till: ruby-talk ML
Ämne: Regular Expression Trouble

Hey!

I'm writing a little script to rename files with weird names but common
bits to a common format. Here's the regular expression I use to extract
the common data:

/.*s?(\d?\d)x?e?(\d\d).*\.(\w{3})$/i

It's meant to rename TV Show files, both video and subtitles. I'm having
trouble making it match the first group however. One of the digits
should be optional, so I stuffed a ? sign there. However, it only
matches one digit, leaving strings like 12x14 with captures ["2", "14"].

I'm not quite sure if there's anything wrong with my expression there,
but I'd swear it's the way to do it. Maybe you're able to see something
I'm looking past.

Thanks!
Chris H. (Guest)
on 2008-12-29 11:59
Tim G. wrote:
>
> .* should probably be set to non greedy .*?, so it doesn't grab things
> you don't want.
>
> /.*?s?(\d?\d)x?e?(\d\d).*?\.(\w{3})$/i
>

This one actually worked. I tried non-greedies all over, but there.
Thanks!!

And thanks also for the hint at rubular. It's awesome.
This topic is locked and can not be replied to.