def _parse_size(size) unit_pattern = /(([kmµucMG]?([glLJm]|mol|Bq)\b)(\/([mµu]?[glL])\b)?)|((Mio\s)?U\.?I\.?)|(%( [mV]\/[mV])?)|(I\.E\.)|(Fl\.)/ numeric_pattern = /\d+(\'\d+)*([.,]\d+)?/ iso_pattern = /[[:alpha:]()\-]+/ description = /(?!#{unit_pattern}\s)#{iso_pattern}(\s+#{iso_pattern})*/u numeric = /#{numeric_pattern}/u unit = /#{unit_pattern}/u count = /(je)?\s*#{numeric}/ multiple = /(#{numeric})\s*(#{unit})?\s*([xXà]|Set)/ measure = /#{numeric}\s*#{unit}\s*#{unit}?/ addition = /#{numeric}\s*#{unit}?\s*\+/ scale = /\/s*#{numeric}?\s*#{unit}/ dose = /\(\s*#{numeric}\s*#{unit}\s*\)/ parser = /(?#{multiple}*)\s*(?#{addition}?)\s*(?#{count}?)\s*(?#{measure}?)\s*(?#{scale}?)\s*(?#{dose}?)\s*(?#{description}?)/ size.match(parser) end str = "200 ml" p _parse_size(str).to_a