# rexular expression quantifiers

Discussion in 'Ruby' started by Johnathan Smith, Jan 7, 2008.

1. ### Johnathan SmithGuest

hi there

just a quick question

what is the difference between greedy and non greedy quantifiers?

cheers
--
Posted via http://www.ruby-forum.com/.

Johnathan Smith, Jan 7, 2008

2. ### Robert KlemmeGuest

2008/1/7, Johnathan Smith <>:
> just a quick question
>
> what is the difference between greedy and non greedy quantifiers?

The greediness.

Seriously: why don't you just try it out in IRB?

s=("a"*10 + "b")
s+=s
s.scan /\w+b/
s.scan /\w+?b/

Cheers

robert

--
use.inject do |as, often| as.you_can - without end

Robert Klemme, Jan 7, 2008

3. ### Marcin MielÅ¼yÅ„skiGuest

Robert Klemme pisze:
> 2008/1/7, Johnathan Smith <>:
>> just a quick question
>>
>> what is the difference between greedy and non greedy quantifiers?

>
> The greediness.
>
> Seriously: why don't you just try it out in IRB?
>
> s=("a"*10 + "b")
> s+=s
> s.scan /\w+b/
> s.scan /\w+?b/
>

There's also possessive one (doesn't backtrack)
ruby 1.9 or jruby 1.1 (trunk)

irb(main):011:0> "aa" =~ /a++a/
=> nil

lopex

Marcin MielÅ¼yÅ„ski, Jan 7, 2008
4. ### James GrayGuest

On Jan 7, 2008, at 11:49 AM, Marcin Miel=C5=BCy=C5=84ski wrote:

> Robert Klemme pisze:
>> 2008/1/7, Johnathan Smith <>:
>>> just a quick question
>>>
>>> what is the difference between greedy and non greedy quantifiers?

>> The greediness.
>> Seriously: why don't you just try it out in IRB?
>> s=3D("a"*10 + "b")
>> s+=3Ds
>> s.scan /\w+b/
>> s.scan /\w+?b/

>
> There's also possessive one (doesn't backtrack)
> ruby 1.9 or jruby 1.1 (trunk)
>
> irb(main):011:0> "aa" =3D~ /a++a/
> =3D> nil

You can get Ruby 1.8 to not backtrack as well:

\$ ruby -ve 'p "aa" =3D~ /(?>a+)a/'
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.1.0]
nil

James Edward Gray II=

James Gray, Jan 7, 2008
5. ### Giles BowkettGuest

> what is the difference between greedy and non greedy quantifiers?

I agree the best way to find out is to audition it in IRB, but just
for completeness, the difference is that a greedy quantifier will grab
the largest possible match, and the non-greedy quantifier will grab
the smallest possible match.

e.g.:

>> /<.+>/.match("<b>stuff</b>")[0]

=> "<b>stuff</b>"
>> /<.+?>/.match("<b>stuff</b>")[0]

=> "<b>"

The only difference is +?, the non-greedy quantifier; using it, you
get the first possible match, instead of the biggest. QED.

--
Giles Bowkett

Podcast: http://hollywoodgrit.blogspot.com
Blog: http://gilesbowkett.blogspot.com
Portfolio: http://www.gilesgoatboy.org
Tumblelog: http://giles.tumblr.com

Giles Bowkett, Jan 7, 2008