github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/internal/regex_helpers_test.go (about) 1 package internal 2 3 import ( 4 "regexp" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func TestMatchCaptureGroups(t *testing.T) { 11 tests := []struct { 12 name string 13 input string 14 pattern string 15 expected map[string]string 16 }{ 17 { 18 name: "go-case", 19 input: "match this thing", 20 pattern: `(?P<name>match).*(?P<version>thing)`, 21 expected: map[string]string{ 22 "name": "match", 23 "version": "thing", 24 }, 25 }, 26 { 27 name: "only matches the first instance", 28 input: "match this thing batch another think", 29 pattern: `(?P<name>[mb]atch).*?(?P<version>thin[gk])`, 30 expected: map[string]string{ 31 "name": "match", 32 "version": "thing", 33 }, 34 }, 35 { 36 name: "nested capture groups", 37 input: "cool something to match against", 38 pattern: `((?P<name>match) (?P<version>against))`, 39 expected: map[string]string{ 40 "name": "match", 41 "version": "against", 42 }, 43 }, 44 { 45 name: "nested optional capture groups", 46 input: "cool something to match against", 47 pattern: `((?P<name>match) (?P<version>against))?`, 48 expected: map[string]string{ 49 "name": "match", 50 "version": "against", 51 }, 52 }, 53 { 54 name: "nested optional capture groups with larger match", 55 input: "cool something to match against match never", 56 pattern: `.*?((?P<name>match) (?P<version>(against|never)))?`, 57 expected: map[string]string{ 58 "name": "match", 59 "version": "against", 60 }, 61 }, 62 } 63 64 for _, test := range tests { 65 t.Run(test.name, func(t *testing.T) { 66 actual := MatchNamedCaptureGroups(regexp.MustCompile(test.pattern), test.input) 67 assert.Equal(t, test.expected, actual) 68 }) 69 } 70 }