Хотя вы можете использовать шаблон, проблему разбиения его на части можно легко решить с помощью других Ruby методов:
Использование split
:
s = "Josua de Grave* (1643-1712)"
name, dates = s.split('*') # => ["Josua de Grave", " (1643-1712)"]
birth, death = dates[2..-2].split('-') # => ["1643", "1712"]
Или, используя scan
:
*name, birth, death = s.scan(/[[:alnum:]]+/) # => ["Josua", "de", "Grave", "1643", "1712"]
name.join(' ') # => "Josua de Grave"
birth # => "1643"
death # => "1712"
Если бы я использовал шаблон, я бы использовал это:
name, birth, death = /^([^*]+).+?(\d+)-(\d+)/.match(s)[1..3] # => ["Josua de Grave", "1643", "1712"]
name # => "Josua de Grave"
birth # => "1643"
death # => "1712"
/(^[^*]+).+?(\d+)-(\d+)/
означает:
^
начало в начале буфера ([^*]+)
захватывать все не *
, где он прекращает захват .+?
пропустить минимум до ... (\d+)
год совпадает и захватывается -
соответствует, но не захватывается (\d+)
год сопоставлен и захвачен
Regexper помогает объяснить это так же, как Rubular .