Read more

Ruby: Using named groups in Regex

Emanuel
May 09, 2019Software engineer at makandra GmbH

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.

Illustration web development

Do you need DevOps-experts?

Your development team has a full backlog? No time for infrastructure architecture? Our DevOps team is ready to support you!

  • We build reliable cloud solutions with Infrastructure as code
  • We are experts in security, Linux and databases
  • We support your dev team to perform
Read more Show archive.org snapshot

Note:

  • In case a string does not match the pattern, .match will return nil.
  • With Ruby 2.4 the result of .match can be transformed to a Hash with named_captures. This allows you to use methods like slice or fetch 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 11:09)