On 2007-10-02 14:46:48 +0200, William James <w_a_x_man / yahoo.com> said:

> On Oct 2, 6:35 am, Josselin <josse... / wanadoo.fr> wrote:
>> I don't use it very often, rather copying from example, but it's so
>> useful that I should learn how to write it
>> I'd appreciate any guru tip on how to proceed once the problem is on
>> the paper :
>> 
>> example :
>> 
>> INPUT STRINGS
>> 
>> 1-  input can contains spaces (should be eliminated)
>> 
>> 2- good patterns :
>> 
>> 2a- an Integer  like 99  (no limit)
>> a   >   >=  <  <=   <>  !=   followed by an Integer      like   >99
>> 
>>> =99  <99  <=99  <>99   !=99
>> 
>> 2b- a String like:    abcd  abc99  99abc  a99bc
>> 
>> 2c- a  % sign  followed by a String
>> like  %abcd  %abc99  %99abc  %a99bc %abcd
>> 
>> 2d- a    String  followed by a  % sign
>> like  abcd%  abc99%  99abc%  a99bc%
>> 
>> 2e- a String leading containing or ending with, one or many * sign(s)
>> like  a*bcd  a**bc99  99*a*bc  *a99bc a99bc*  *a99bc*     *a9**9b*c*
>> 
>> 3-any other pattern will be considered as wrong
>> 
>> OUTPUTS
>> 
>> 2a ->   an array [characters, Integer]    like   [ "<>", 99]
>> 2b, 2c, 2d,2e  ->  an array [ nil, String]  like  [nil, abcd]  or [nil,
>> %abcd] or [nil, a99bc%] or [nil, *a9**9b*c]
>> 
>> I am interesting in understanding the design process... : how should I
>> start when designing such gsub routine ?
>> should I state it differently on paper first ?  well, any tip that can
>> help me to build the next ones....
>> 
>> thanks for your support
>> 
>> joss
> 
> def foo s
>   case s
>     when /^(>|>=|<|<=|<>|!=)?(\d+)$/
>       [ $1 || "", $2.to_i ]
>     when /^(%)?[a-z\d]+(%)?$/
>       return nil  if 1 != $~.captures.compact.size
>       [ nil, $& ]
>     when /^(?=.*\*)[*a-z\d]+$/
>       [ nil, $& ]
>   end
> end
> 
> p foo( "88" )
> p foo( "<>88" )
> p foo( "%33" )
> p foo( "33%" )
> p foo( "a*9" )
> p foo( 'bat' )

thanks a lot , William,  I can see how you built it..  I just have 2 
points to clarify if you don't mind

1-  return nil  if 1 != $~.captures.compact.size
I don't catch up

2- (?=.*\*)

otherwise I commented it .. is my understanding correct ?

def foo s
  case s
    when /^(>|>=|<|<=|<>|!=)?(\d+)$/
	# start with > OR >= OR < OR <= OR <> OR != (0 or 1 time) then 
digit(0-9) n times
      [ $1 || "", $2.to_i ]
	# first element or nil , second element to integer

    when /^(%)?[a-z\d]+(%)?$/
	# start with % ( 0 or 1 time) then characters a-zA-Z 1 or n times then 
end with  % ( 0 or 1 time)
      return nil  if 1 != $~.captures.compact.size
	# return nil if .....
      [ nil, $& ]
	# first element nil, second element = parameter

    when /^(?=.*\*)[*a-z\d]+$/
	# start with *( 0 or n times)...... then characters *a-zA-Z 1 or n tiems
      [ nil, $& ]
	# first element nil, second element = parameter
  end
end