Extracting numbers from a string

I have filenames from various digital cameras: DSC_1234.jpg,
CRW1234.jpg, etc. What I really want is the numeric portion of that
filename. How would I extract just that portion?

I expect it to involve the regex /\d+/, but I’m unclear how to extract a
portion of a string matching a regex.

Thank you

Matt J. wrote:

I have filenames from various digital cameras: DSC_1234.jpg,
CRW1234.jpg, etc. What I really want is the numeric portion of that
filename. How would I extract just that portion?

I expect it to involve the regex /\d+/, but I’m unclear how to extract a
portion of a string matching a regex.

Thank you

This may be the simplest (and arguably the most ruby-esque):
str = “DSC_1234.jpg”
num = str.scan(/\d+/)[0]

Other ways to do it:
num = str.match(/\d+/)[0]

OR
num = (/\d+/).match(str)[0]

OR
num = str.scan(/\d+/) {|match| match}

OR
num = str =~ /(\d+)/ ? $1 : nil

That is,
num = if str =~ /(\d+)/
$1
else
nil
end

OR
if str =~ /\d+/
num = $~[0]
end

Some proponents of ruby have said that perl’s “There is more than one
way to do it,” is a curse. But the same is true of ruby. However, it
seems to me that most people learn reasonable idioms and common sense
prevails.

Dan

Matt J. wrote:

I have filenames from various digital cameras: DSC_1234.jpg,
CRW1234.jpg, etc. What I really want is the numeric portion of that
filename. How would I extract just that portion?

I expect it to involve the regex /\d+/, but I’m unclear how to extract a
portion of a string matching a regex.

Thank you

a = “DSC_1234.jpg”
b = a.gsub(/[^[:digit:]]/, ‘’)

If you just want to extract one number from a string, you could write
something like :

if a=“DSC_1234.jpg”

then a[/\d+/] will give you the first longest string of numbers, so
1234.

If you want to be more precise, you could use parenthesis to extract
the exact portion you want, like :

a[/DSC_(\d+).jpg/,1] (<=> a.match(/DSC_(\d+).jpg/)[1])

or even : a[/\ADSC_(\d+).jpg\Z/,1]

On 12.06.2007 09:32, come wrote:

a[/DSC_(\d+).jpg/,1] (<=> a.match(/DSC_(\d+).jpg/)[1])

or even : a[/\ADSC_(\d+).jpg\Z/,1]

Or even simpler

irb(main):001:0> “DSC_1234.jpg”[/\d+/]
=> “1234”
irb(main):002:0> Integer(“DSC_1234.jpg”[/\d+/])
=> 1234

Kind regards

robert

On Tue, Jun 12, 2007 at 03:45:04PM +0900, Matt J. wrote:

I have filenames from various digital cameras: DSC_1234.jpg,
CRW1234.jpg, etc. What I really want is the numeric portion of that
filename. How would I extract just that portion?

Some solutions have been posted already, but here’s mine:

irb(main):001:0> s=“DSC_1234.jpg”
=> “DSC_1234.jpg”
irb(main):002:0> s.sub(/\D+(\d+).*/,‘\1’)
=> “1234”

basicially the regexp looks for :

  • one or more non-digits
  • one or more digits => because this is between parenthesis you can
    refer to
    it with \1 later on
  • something more

The digits (safely stored in \1) is all you want to keep… this assumed
you
are only interested in the first sequence of numbers.

Cheers

Bas


Bas van Gils [email protected], http://www.van-gils.org
[[[ Thank you for not distributing my E-mail address ]]]

Quod est inferius est sicut quod est superius, et quod est superius est
sicut
quod est inferius, ad perpetranda miracula rei unius.

On Jun 12, 2007, at 2:45 AM, Matt J. wrote:

I have filenames from various digital cameras: DSC_1234.jpg,
CRW1234.jpg, etc. What I really want is the numeric portion of that
filename. How would I extract just that portion?

I expect it to involve the regex /\d+/, but I’m unclear how to
extract a
portion of a string matching a regex.

Thank you

Last November (2006), there was a series of postings to the Columbus
Ruby Brigade list beginning with:
http://groups.google.com/group/columbusrb/browse_frm/thread/
9c2e682f9926bad0

This was the pattern that I used when responding to Bill’s code
because many of my pictures had names like “100_5142.jpg”,
“100_5143.jpg”, etc.

NUMBERED_FILE_PATTERN = %r{^(.*\D)?(\d+)(.+)$}

It became a constant since I used it in three places.

Rob B. http://agileconsultingllc.com
[email protected]

A big thanks to everybody and all the creative solutions!