Greedy and non greedy quantifiers

Im just after a bit of clarification with quantifiers in regular
expressions.
I just want to be sure of the differences between the quantifiers. so
for these various regular expressions,

[a-z]* - this will match any amount lower case letters
[a-z]+ - this will match any amount lower case letters
           (whats difference between + and * in this case?)
[a-z]+? -

or

\d* - This will match any amount of digits
\d*? - This will only match none or one number

Please can someone offer some clarification Im still unsure of myself
with these expresions as I'm new to ruby,
Thanks,
Dan

···

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

Im just after a bit of clarification with quantifiers in regular
expressions.
I just want to be sure of the differences between the quantifiers. so
for these various regular expressions,

[a-z]* - this will match any amount lower case letters
[a-z]+ - this will match any amount lower case letters
           (whats difference between + and * in this case?)
[a-z]+? -

or

\d* - This will match any amount of digits
\d*? - This will only match none or one number

Please can someone offer some clarification Im still unsure of myself
with these expresions as I'm new to ruby,
Thanks,
Dan

Dan

* matches 0 or more of the preceding pattern
+ matches 1 or more of the preceding pattern
? matches 0 or 1 of the preceding pattern
{n,m} matches n to m of the preceding pattern

I stand to be corrected but I don't believe that *? or +? are valid at all.

Andrew Timberlake
andrew@andrewtimberlake.com
082 415 8283
skype: andrewtimberlake

"I have never let my schooling interfere with my education."
                                                --Mark Twain

There are 4 (I hope that didn't miss anything) operators to specify repetitions.

*, +, ? and {m, n}
* - matches 0 or more
+ - matches 1 or more
? - matches 0 or 1 (same as {0,1} )
{m,n} matches m..n

All these operators all greedy (I'll show you examples). To make
non-greedy operator you must add '?' after operator. So non-greedy
operators are:
*?, +?, ??, {m,n}?
*? - matches 0 or more
+? - matches 1 or more
?? - matches 0 or 1 (same as {0,1}?)
{m,n} matches m..n

Maybe '??' looks strange, but all of these are absolutely correct.

So far no differences.

Why we have greedy and non-greedy operators? Because they works in
different way. Greedy operators tries to match as many character
(precisely: left expression) as can and if during matching it must
move back it tries to match fewer characters.

For example:
puts "aaaa".match(/a*/) # matches whole string
puts "aaaa" =~ /a*?/ # matches no characters (but it success)

Another example:
puts "aaaabaaaab".match(/.*b/) # matches whole string
puts "aaaabaaaab".match(/.*?b/) # matches "aaab"

I always recommend Jeffrey Friedl's book "Mastering Regular
Expressions" (http://regex.info/). After reading this book you will be
master of regexp ;-).

···

--
Radosław Bułat

http://radarek.jogger.pl - mój blog

Andrew Timberlake wrote:

or

\d* - This will match any amount of digits
\d*? - This will only match none or one number

Please can someone offer some clarification Im still unsure of myself
with these expresions as I'm new to ruby,
Thanks,
Dan

Dan

* matches 0 or more of the preceding pattern
+ matches 1 or more of the preceding pattern
? matches 0 or 1 of the preceding pattern
{n,m} matches n to m of the preceding pattern

I stand to be corrected but I don't believe that *? or +? are valid at
all.

yeah that helps thanks, I think I was just making things up..

···

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

puts "aaaabaaaab".match(/.*?b/) # matches "aaab"

It of course matches "aaaab" (missing one 'a')

There are 4 (I hope that didn't miss anything) operators to specify repetitions.

*, +, ? and {m, n}
* - matches 0 or more
+ - matches 1 or more
? - matches 0 or 1 (same as {0,1} )
{m,n} matches m..n

All these operators all greedy (I'll show you examples). To make
non-greedy operator you must add '?' after operator. So non-greedy
operators are:
*?, +?, ??, {m,n}?
*? - matches 0 or more
+? - matches 1 or more
?? - matches 0 or 1 (same as {0,1}?)
{m,n} matches m..n

Maybe '??' looks strange, but all of these are absolutely correct.

So far no differences.

Why we have greedy and non-greedy operators? Because they works in
different way. Greedy operators tries to match as many character
(precisely: left expression) as can and if during matching it must
move back it tries to match fewer characters.

For example:
puts "aaaa".match(/a*/) # matches whole string
puts "aaaa" =~ /a*?/ # matches no characters (but it success)

But can match more if it needs to to make the match a success:

irb(main):005:0> /a*?/.match("aaab").to_a
=> [""]
irb(main):006:0> /a*?b/.match("aaab").to_a
=> ["aaab"]

Another example:
puts "aaaabaaaab".match(/.*b/) # matches whole string
puts "aaaabaaaab".match(/.*?b/) # matches "aaab"

I always recommend Jeffrey Friedl's book "Mastering Regular
Expressions" (http://regex.info/\). After reading this book you will be
master of regexp ;-).

Definitively worth reading!

Cheers

  robert

···

On 17.01.2008 12:17, Rados?aw Bu?at wrote: