Regular expression / gsub question

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(/
.
/,"")

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.

Thanks! This worked nicely. I have never used #[], this is great! Thanks
so much!!

You can also do a filename.split(/_/)[1] which is probably not that
efficient but you can get all three parts of the string.

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. 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?

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.