Robert Schaaf wrote:
> Now I know this is only peripherally topical, but can anyone come up 
> with the regexp that achieves this:
> 
> string =~ pattern
> [$1, $2, $3]
> 
>  where string is a Roman numeral, optionall followed by "(?)" or alpha, 
> which, if present can be followed by an Arabic number,
> 
> produces
> 
> I -> ["I", nil, nil]
> I(?) -> ["I", "(?)", nil]
> Ia -> ["I", "a", nil]
> Ib -> ["I", "b", nil]
> IIa1 -> ["II", "a", "1"]
> IIa2 -> ["II", "a", "2"]

Do you need the regex to validate the Roman numeral itself? If not, the 
following passes your tests (assuming that you don't mind compacting out 
the nils). You can do validation subsequently.

rx = /\A([IVXLCDM]+)(?:(\(\?\))|([a-z])(\d+)?)?\z/

strs = [
   ["I",    ["I", nil, nil]],
   ["I(?)", ["I", "(?)", nil]],
   ["Ia",   ["I", "a", nil]],
   ["Ib",   ["I", "b", nil]],
   ["IIa1", ["II", "a", "1"]],
   ["IIa2", ["II", "a", "2"]]
]

strs.each do |str, expected|
   if rx.match str
     match = $~.captures
     if match.compact == expected.compact
       puts "#{str.inspect} ok"
     else
       puts "#{str.inspect} fails: match=#{match.inspect}"
     end
   else
     puts "#{str.inspect} fails: not matched"
   end
end

-- 
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407