Hi all
I have a big PCRE regex, that have conditional named groups. I want to reference all of the groups, even if match didn't occur and handle it on my side with simple if or something like this.
As nre documentation states: captures[]: string the string value of whatever was captured at that id. If the value is invalid, then behavior is undefined. If the id is -1, then the whole match is returned. If the given capture was not matched, nil is returned.
"abc".match(re"(\w)").get.captures[0] == "a"
"abc".match(re"(?<letter>\w)").get.captures["letter"] == "a"
"abc".match(re"(\w)\w").get.captures[-1] == "ab"
I can do that and get nil, if pattern was not matched. But actual nre code contains this:
func checkNamedCaptured(pattern: RegexMatch, name: string): void =
if not (name in pattern.captureBounds):
raise newException(KeyError, "Group '" & name & "' was not captured")
...
func `[]`*(pattern: Captures, name: string): string =
let pattern = RegexMatch(pattern)
checkNamedCaptured(pattern, name)
return pattern.captures[pattern.pattern.captureNameToId[name]]
Which throws error if named group was not matched.