From: "Jesús Gabriel y Galán" Date: 2010-11-03T19:44:49+09:00 Subject: Re: Regular Expression On Wed, Nov 3, 2010 at 11:10 AM, Robert Klemme wrote: > Interesting approach.  I would simply have done > > def check(input) >  raise ArgumentError, "Illegal chars in sequence: %p" % input unless > /\A[A-D]{0,4}\z/ =~ input >  cnt = Hash.new 0 >  input.scan /./ do |m| >    raise ArgumentError, "Illegal sequence %p" % input if (cnt[m] += 1) > 1 >    # alt: return false >  end >  # alt: true > end There are different requirements for each letter. Adapting your solution: def check(input) limits = {'A' => 1, 'B' => 1, 'C' => 1, 'D' => 2} raise ArgumentError, "Illegal chars in sequence: %p" % input unless /\A[A-D]{0,4}\z/ =~ input cnt = Hash.new 0 input.scan /./ do |m| cnt[m] += 1 end cnt.each do |letter, amount| raise ArgumentError, "Illegal chars in sequence: %p" % input if amount > limits[letter] end end Jesus.