Fixed bad cature groups with multiple matches #1114

This commit is contained in:
Mike Farah 2022-02-20 13:28:13 +11:00
parent 304fc462a4
commit fc447b46ce
3 changed files with 19 additions and 13 deletions

View File

@ -105,14 +105,14 @@ will output
captures: [] captures: []
``` ```
## Match with capture groups ## Match with global capture group
Given a sample.yml file of: Given a sample.yml file of:
```yaml ```yaml
abc abc abc abc
``` ```
then then
```bash ```bash
yq '[match("(abc)+"; "g")]' sample.yml yq '[match("(ab)(c)"; "g")]' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -120,16 +120,22 @@ will output
offset: 0 offset: 0
length: 3 length: 3
captures: captures:
- string: abc - string: ab
offset: 0 offset: 0
length: 3 length: 2
- string: c
offset: 2
length: 1
- string: abc - string: abc
offset: 4 offset: 4
length: 3 length: 3
captures: captures:
- string: abc - string: ab
offset: 4 offset: 4
length: 3 length: 2
- string: c
offset: 6
length: 1
``` ```
## Match with named capture groups ## Match with named capture groups

View File

@ -136,19 +136,19 @@ func match(matchPrefs matchPreferences, regEx *regexp.Regexp, candidate *Candida
} }
for i, matches := range allMatches { for i, matches := range allMatches {
capturesNode := &yaml.Node{Kind: yaml.SequenceNode} capturesListNode := &yaml.Node{Kind: yaml.SequenceNode}
match, submatches := matches[0], matches[1:] match, submatches := matches[0], matches[1:]
for j, submatch := range submatches { for j, submatch := range submatches {
captureNode := &yaml.Node{Kind: yaml.MappingNode} captureNode := &yaml.Node{Kind: yaml.MappingNode}
captureNode.Content = addMatch(capturesNode.Content, submatch, allIndices[i][2+j*2], subNames[j+1]) captureNode.Content = addMatch(captureNode.Content, submatch, allIndices[i][2+j*2], subNames[j+1])
capturesNode.Content = append(capturesNode.Content, captureNode) capturesListNode.Content = append(capturesListNode.Content, captureNode)
} }
node := &yaml.Node{Kind: yaml.MappingNode} node := &yaml.Node{Kind: yaml.MappingNode}
node.Content = addMatch(node.Content, match, allIndices[i][0], "") node.Content = addMatch(node.Content, match, allIndices[i][0], "")
node.Content = append(node.Content, node.Content = append(node.Content,
createScalarNode("captures", "captures"), createScalarNode("captures", "captures"),
capturesNode, capturesListNode,
) )
results.PushBack(candidate.CreateReplacement(node)) results.PushBack(candidate.CreateReplacement(node))

View File

@ -30,11 +30,11 @@ var stringsOperatorScenarios = []expressionScenario{
}, },
}, },
{ {
description: "Match with capture groups", description: "Match with global capture group",
document: `abc abc`, document: `abc abc`,
expression: `[match("(abc)+"; "g")]`, expression: `[match("(ab)(c)"; "g")]`,
expected: []string{ expected: []string{
"D0, P[], (!!seq)::- string: abc\n offset: 0\n length: 3\n captures:\n - string: abc\n offset: 0\n length: 3\n- string: abc\n offset: 4\n length: 3\n captures:\n - string: abc\n offset: 4\n length: 3\n", "D0, P[], (!!seq)::- string: abc\n offset: 0\n length: 3\n captures:\n - string: ab\n offset: 0\n length: 2\n - string: c\n offset: 2\n length: 1\n- string: abc\n offset: 4\n length: 3\n captures:\n - string: ab\n offset: 4\n length: 2\n - string: c\n offset: 6\n length: 1\n",
}, },
}, },
{ {