An alternative of using a multiple assignment for a Regex are named groups. Especially when your Regex becomes more complicates it is easier to understand and to process.
Note:
- In case a string does not match the pattern,
.match
will returnnil
. - With Ruby 2.4 the result of
.match
can be transformed to aHash
withnamed_captures
. This allows you to use methods likeslice
orfetch
on the result.
Example with a multiple assignment
PRODUCT_PATTERN = /\A(.+) S\/N:(\w+)\z/
product = "Bosch S/N:WS200LN12"
manufacturer, serial_number = product.match(PRODUCT_PATTERN)&.captures
# or
manufacturer = product[PRODUCT_PATTERN, 1]
serial_number = product[PRODUCT_PATTERN, 2]
Example with named groups (<2.4)
PRODUCT_PATTERN = /\A(?<manufacturer>.+) S\/N:(?<serial_number>\w+)\z/
product = "Bosch S/N:WS200LN12"
match = product.match(PRODUCT_PATTERN) || {}
manufacturer = match[:manufacturer]
serial_number = match[:serial_number]
# or
manufacturer = product[PRODUCT_PATTERN, :manufacturer]
serial_number = product[PRODUCT_PATTERN, :serial_number]
Example with named groups (>=2.4)
PRODUCT_PATTERN = /\A(?<manufacturer>.+) S\/N:(?<serial_number>\w+)\z/
product = "Bosch S/N:WS200LN12"
match = product.match(PRODUCT_PATTERN)
manufacturer = match&.named_captures&.fetch('manufacturer')
serial_number = match&.named_captures&.fetch('serial_number')
Posted by Emanuel to makandra dev (2019-05-09 09:09)