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 online protection

Rails Long Term Support

Rails LTS provides security patches for old versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2)

  • Prevents you from data breaches and liability risks
  • Upgrade at your own pace
  • Works with modern Rubies
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)