Forum: Ruby regular expression / gsub question

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.
Mmcolli00 M. (Guest)
on 2009-03-13 21:35
Hi
Do you know how use a regular expression to get only the scripname from
the each filename below? I have long filename and I want to pull out a
segment "scriptname" only. I have been using a regular expression with
gsub for this.

filename

userfilename_scriptname_030109.txt
userfilename3_scriptname1_031109.txt
userfilename_scriptname0_031209.txt


The gsub didn't work because the _ on both sides causes me to delete the
whole filename. What would you recommend?

stripfirstpart = filename.gsub(/*_/,"")
stripsecondpart = filename.gsub(/_.*/,"")
Joel VanderWerf (Guest)
on 2009-03-13 21:49
(Received via mailing list)
Mmcolli00 Mom wrote:
> userfilename_scriptname0_031209.txt
>
>
> The gsub didn't work because the _ on both sides causes me to delete the
> whole filename. What would you recommend?
>
> stripfirstpart = filename.gsub(/*_/,"")
> stripsecondpart = filename.gsub(/_.*/,"")

I like using #[] for this because it lets you think in terms of what you
want to keep rather than what you want to remove.

filename[/_(.*?)_/, 1]

The ? is there in case there are more underscores later in the filename.
Mmcolli00 M. (Guest)
on 2009-03-13 22:17
Thanks! This worked nicely. I have never used #[], this is great! Thanks
so much!!
Robert K. (Guest)
on 2009-03-14 12:02
(Received via mailing list)
On 13.03.2009 20:46, Joel VanderWerf wrote:
>> userfilename3_scriptname1_031109.txt
> want to keep rather than what you want to remove.
>
> filename[/_(.*?)_/, 1]
>
> The ? is there in case there are more underscores later in the filename.

AFAIK it is more robust and also more efficient to do

filename[/_([^_]+)_/, 1]

or even

filename[/_(scriptname\d*)_/, 1]

or even

filename[/\Auserfilename\d*_(scriptname\d*)_\d+\.txt\z/, 1]

In other words, rather explicitly define precisely what you want to
match than rely on (non)greediness of repetition operators.

Kind regards

  robert
Milan D. (Guest)
on 2009-03-14 12:18
You can also do a filename.split(/_/)[1] which is probably not that
efficient but you can get all three parts of the string.
7stud -. (Guest)
on 2009-03-14 14:24
Milan D. wrote:
> You can also do a filename.split(/_/)[1]
>
> which is probably not that
> efficient but you can get all three parts of the string.

Do you mean "not that efficient" in the sense that ruby programs are
ponderously slow and that isn't?
Milan D. (Guest)
on 2009-03-14 14:54
7stud -- wrote:
> Milan D. wrote:
>> You can also do a filename.split(/_/)[1]
>>
>> which is probably not that
>> efficient but you can get all three parts of the string.
>
> Do you mean "not that efficient" in the sense that ruby programs are
> ponderously slow and that isn't?
I still believe that
filename[/\Auserfilename\d*_(scriptname\d*)_\d+\.txt\z/, 1]
is the most efficient way of doing that. I just provide this as another
option.
This topic is locked and can not be replied to.