From: Chris Shea Date: 2007-12-31T15:50:27+09:00 Subject: Re: Questions about * + and ? in Regex On Dec 30, 2007 11:25 PM, Carlos Ortega wrote: > Hi, > > I have some questions related the correct meaning of * + and ? in Regex > that I would appreciate some clarification: > I have an example (derived from the Programming Ruby 2nd Edition), that > I don't understand why gives these results, here is the code: > > def show_regexp(a, re) > if a =~ re > puts "#{$`}<<#{$&}>>#{$'}" > else > puts "no match" > end > end > > show_regexp('Example1', /\s*/) > show_regexp('Example2', /\s.*/) > show_regexp('Example3 ', /\s.?/) # Space at the end of string > show_regexp('Example4 ', /\s.+/) # Space at the end of string > show_regexp('Example5 ', /\s.*/) # Space at the end of string > > output gives: > > <<>>Example1 > no match > Example3<< >> > no match > Example5<< >> > > If I understand well: > * means - match zero or more occurrences of preceding expression. > + means - match 1 or more occurrences of preceding expression. > ? means - match 0 or 1 occurrence of preceding expression. > > Why Example2 gives "no match"? I understand this as find "0 or more > occurrences" of (a space followed by any character) > Why Example4 gives "no match"? I understand this as find "1 or more > occurrence" of (a space followed by any character) > I am assuming that the null character can be matched by a . > Am I correct? > > Best Regards > -- > Posted via http://www.ruby-forum.com/. > > A dot (.) can only match an actual character. Example 2 fails because it's looking not for "0 or more occurrences of (a space followed by any character)", but "a space followed by 0 or more characters". The * only applies to whatever immediately precedes it, not the whole expression... unless the expression's enclosed in parentheses. A regex for "0 or more occurrences of (a space followed by any character)" would be /(\s.)*/. In that case, the * applies to the parenthesized group of whitespace and dot. Example 4 fails because the only space isn't followed by anything at all. HTH, Chris P.S. I strongly recommend Jeffrey Friedl's Mastering Regular Expressions.