Skip to content

Commit

Permalink
Fixed bad cature groups with multiple matches #1114
Browse files Browse the repository at this point in the history
  • Loading branch information
mikefarah committed Feb 20, 2022
1 parent 304fc46 commit fc447b4
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 13 deletions.
18 changes: 12 additions & 6 deletions pkg/yqlib/doc/operators/string-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,31 +105,37 @@ 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
- string: abc
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
Expand Down
8 changes: 4 additions & 4 deletions pkg/yqlib/operator_strings.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
6 changes: 3 additions & 3 deletions pkg/yqlib/operator_strings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
},
{
Expand Down

0 comments on commit fc447b4

Please sign in to comment.