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: []
```
## Match with capture groups
## Match with global capture group
Given a sample.yml file of:
```yaml
abc abc
```
then
```bash
yq '[match("(abc)+"; "g")]' sample.yml
yq '[match("(ab)(c)"; "g")]' sample.yml
```
will output
```yaml
@ -120,16 +120,22 @@ will output
offset: 0
length: 3
captures:
- string: abc
- string: ab
offset: 0
length: 3
length: 2
- string: c
offset: 2
length: 1
- string: abc
offset: 4
length: 3
captures:
- string: abc
- string: ab
offset: 4
length: 3
length: 2
- string: c
offset: 6
length: 1
```
## 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 {
capturesNode := &yaml.Node{Kind: yaml.SequenceNode}
capturesListNode := &yaml.Node{Kind: yaml.SequenceNode}
match, submatches := matches[0], matches[1:]
for j, submatch := range submatches {
captureNode := &yaml.Node{Kind: yaml.MappingNode}
captureNode.Content = addMatch(capturesNode.Content, submatch, allIndices[i][2+j*2], subNames[j+1])
capturesNode.Content = append(capturesNode.Content, captureNode)
captureNode.Content = addMatch(captureNode.Content, submatch, allIndices[i][2+j*2], subNames[j+1])
capturesListNode.Content = append(capturesListNode.Content, captureNode)
}
node := &yaml.Node{Kind: yaml.MappingNode}
node.Content = addMatch(node.Content, match, allIndices[i][0], "")
node.Content = append(node.Content,
createScalarNode("captures", "captures"),
capturesNode,
capturesListNode,
)
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`,
expression: `[match("(abc)+"; "g")]`,
expression: `[match("(ab)(c)"; "g")]`,
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",
},
},
{