Regular Expression Trouble


#1

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!


#2

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.


#3

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?


#4

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!


#5

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.