From: "Jesús Gabriel y Galán" Date: 2008-11-20T22:17:06+09:00 Subject: Re: search reg-exp for exact match On Thu, Nov 20, 2008 at 1:49 PM, John Butler wrote: > Hi, > > I have a regular expression > /\b2003|\2004|\2005|\2006|\2007|\2008|\2009\b/ > and i want to check if various years are present. > > "2003" =~ /\b2003|\2004|\2005|\2006|\2007|\2008|\2009\b/ > returns 0 as expected > > "2010" =~ /\b2003|\2004|\2005|\2006|\2007|\2008|\2009\b/ > returns nil as expected > > But i want only exact matches so when i search for "2003 - 2008" i want > nil returned as there is no exact match for that particular string. I > thought the \b would give me this but it doesnt. > > "2003 - 2008" =~ /\b2003|\2004|\2005|\2006|\2007|\2008|\2009\b/ > returns 0 i want nil returned. > > Anyone help? To do exactly what you are asking for: you can anchor the regexp to the beggining or end of the string: irb(main):013:0> re = /\A(2003|2004|2005|2006|2007|2008|2009)\Z/ => /\A(2003|2004|2005|2006|2007|2008|2009)\Z/ irb(main):014:0> "2003" =~ re => 0 irb(main):015:0> "2003 - 2008" =~ re => nil In this case you don't need the \b anymore. BTW, you had typos there because you had \2 instead of \b. Anyway, if you want exact matches of strings you don't need regexps: irb(main):018:0> years = (2003..2009).map {|x| x.to_s} => ["2003", "2004", "2005", "2006", "2007", "2008", "2009"] irb(main):020:0> years.include? "2003" => true irb(main):021:0> years.include? "2003 - 2008" => false If you have many numbers and many lookups, a Set should be better, performance-wise. Now, if we are talking about ranges of years we can do even better: irb(main):022:0> min_year = 2003 => 2003 irb(main):023:0> max_year = 2009 => 2009 irb(main):024:0> year_to_test = "2003".to_i => 2003 irb(main):025:0> min_year <= year_to_test and year_to_test <= max_year => true irb(main):026:0> year_to_test = "2008".to_i => 2008 irb(main):027:0> min_year <= year_to_test and year_to_test <= max_year => true irb(main):028:0> year_to_test = "2010".to_i => 2010 irb(main):029:0> min_year <= year_to_test and year_to_test <= max_year => false Hope this helps, Jesus.