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/ .
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
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.
···
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.
Robert_K1
(Robert K.)
12 November 2008 20:27
6
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
···
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"