stdlib icon indicating copy to clipboard operation
stdlib copied to clipboard

Add named capturing groups to gleam/regex.Match

Open yoonthegoon opened this issue 7 months ago • 6 comments

As it is now, you have the ability to write named capturing groups, but those results don't appear in the list of matches returned from regex.scan.

import gleam/io
import gleam/regex

pub fn main() {
  let assert Ok(regex) = regex.from_string("(?<delim>,)")
  let content = "Hello, world!"

  regex.scan(regex, content)
  |> io.debug
}
[Match(content: ",", submatches: [Some(",")])]

I propose Match have the following signature:

pub type Match {
  Match(
    /// The full string of the match.
    content: String,
    /// A `Regex` can have subpatterns, sup-parts that are in parentheses.
    submatches: List(#(String, Option(String))),
  )
}

So now running something like this

import gleam/io
import gleam/regex

pub fn main() {
  let assert Ok(regex) = regex.from_string("(?<type_of>new|old)\\s+(\\w+)")
  let content = "new match_type"

  regex.scan(regex, content)
  |> io.debug
}

would give you this

[Match(content: "new match_type", submatches: [#("type_of", Some("new")), #("2", Some("match_type"))])]

If the concern is this may break existing used regex, possibly a new added option (which will still break existing compiled regex) or a new groups function can be added that returns just a list of tuples of group name and submatches.

yoonthegoon avatar Jul 21 '24 18:07 yoonthegoon