![]() |
Ruby Sub Regular Expression
Hello! I have a string: "Hello - 1 - World"
irb(main):017:0> a = "Hello - 1 - World" => "Hello - 1 - World" I want to chop off the "Hello - " part. Hello could be any word, so I want to match it generically. To match the first minus I do this: irb(main):018:0> b = a.sub(/\s-\s/, "") => "Hello1 - World" Good! Now to get rid of the first word I try this: irb(main):019:0> c = a.sub(/.*\s-\s/, "") => "World" Bad! It matched to the second minus! Why does sub do this? I thought it was supposed to match the first occurrence only. -- Posted via http://www.ruby-forum.com/. |
Re: Ruby Sub Regular Expression
Hi. You missed out your non-greedy operator (if thats the right term) in
your regex. Try: a = "Hello - 1 - World" c = a.sub(/.*?\s-\s/, "") irb(main):004:0> c = a.sub(/.*?\s-\s/, "") => "1 - World" Hope that helps Jim Dave Roberts wrote: > Hello! I have a string: "Hello - 1 - World" > > irb(main):017:0> a = "Hello - 1 - World" > => "Hello - 1 - World" > > I want to chop off the "Hello - " part. Hello could be any word, so I > want to match it generically. > To match the first minus I do this: > > irb(main):018:0> b = a.sub(/\s-\s/, "") > => "Hello1 - World" > > Good! Now to get rid of the first word I try this: > > irb(main):019:0> c = a.sub(/.*\s-\s/, "") > => "World" > > Bad! It matched to the second minus! Why does sub do this? I thought > it was supposed to match the first occurrence only. > > ------------------------------------------------------------------------ > > > No virus found in this incoming message. > Checked by AVG - http://www.avg.com > Version: 8.0.175 / Virus Database: 270.9.0/1777 - Release Date: 09/11/2008 09:53 > > |
Re: Ruby Sub Regular Expression
On Wed, Nov 12, 2008 at 4:52 PM, Dave Roberts <dave.a.roberts@gmail.com> wrote:
> Hello! I have a string: "Hello - 1 - World" > > irb(main):017:0> a = "Hello - 1 - World" > => "Hello - 1 - World" > > I want to chop off the "Hello - " part. Hello could be any word, so I > want to match it generically. > To match the first minus I do this: > > irb(main):018:0> b = a.sub(/\s-\s/, "") > => "Hello1 - World" > > Good! Now to get rid of the first word I try this: > > irb(main):019:0> c = a.sub(/.*\s-\s/, "") > => "World" > > Bad! It matched to the second minus! Why does sub do this? I thought > it was supposed to match the first occurrence only. Because * by default is greedy, so it tries to match as much as it can. Try this: irb(main):002:0> c = a.sub(/.*?\s-\s/, "") => "1 - World" Jesus. |
Re: Ruby Sub Regular Expression
|
Re: Ruby Sub Regular Expression
|
Re: Ruby Sub Regular Expression
On 12.11.2008 17:14, Jesús Gabriel y Galán wrote:
> On Wed, Nov 12, 2008 at 4:52 PM, Dave Roberts <dave.a.roberts@gmail.com> wrote: >> Hello! I have a string: "Hello - 1 - World" >> >> irb(main):017:0> a = "Hello - 1 - World" >> => "Hello - 1 - World" >> >> I want to chop off the "Hello - " part. Hello could be any word, so I >> want to match it generically. >> To match the first minus I do this: >> >> irb(main):018:0> b = a.sub(/\s-\s/, "") >> => "Hello1 - World" >> >> Good! Now to get rid of the first word I try this: >> >> irb(main):019:0> c = a.sub(/.*\s-\s/, "") >> => "World" >> >> Bad! It matched to the second minus! Why does sub do this? I thought >> it was supposed to match the first occurrence only. > > Because * by default is greedy, so it tries to match as much as it can. > Try this: > > irb(main):002:0> c = a.sub(/.*?\s-\s/, "") > => "1 - World" Other variants would be irb(main):001:0> a = "Hello - 1 - World" => "Hello - 1 - World" irb(main):002:0> a[/\d+\s+-.*/] => "1 - World" irb(main):003:0> a.sub /^\S+\s+-\s+/, '' => "1 - World" irb(main):004:0> a.sub /^\w+\s+-\s+/, '' => "1 - World" irb(main):005:0> Cheers robert |
Re: Ruby Sub Regular Expression
On Wed, Nov 12, 2008 at 5:11 PM, Jim McKerchar
<jim.mckerchar@btinternet.com> wrote: > Hi. You missed out your non-greedy operator (if thats the right term) "lazy" |
Re: Ruby Sub Regular Expression
Thanks Henrik
Henrik Nyh wrote: > On Wed, Nov 12, 2008 at 5:11 PM, Jim McKerchar > <jim.mckerchar@btinternet.com> wrote: > >> Hi. You missed out your non-greedy operator (if thats the right term) >> > > "lazy" > > ------------------------------------------------------------------------ > > > Internal Virus Database is out of date. > Checked by AVG - http://www.avg.com > Version: 8.0.175 / Virus Database: 270.9.0/1777 - Release Date: 09/11/2008 09:53 > > |
| All times are GMT. The time now is 02:55 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.