From 1d2ca509c77cbb2af0475b1319cd840f8ce9a1d0 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 6 Jul 2019 17:17:46 +0200 Subject: Split in packages --- internal/re/re.go | 36 ++++++++++++++++++++++++++++++++++++ internal/re/re_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 internal/re/re.go create mode 100644 internal/re/re_test.go (limited to 'internal/re') diff --git a/internal/re/re.go b/internal/re/re.go new file mode 100644 index 0000000..b235282 --- /dev/null +++ b/internal/re/re.go @@ -0,0 +1,36 @@ +package re + +import ( + "errors" + "regexp" + "strings" +) + +var errNotRE = errors.New("not re") + +func Replace(s, r string, global bool) (string, error) { + // min: at least two separators + if len(r) < 2 { + return "", errNotRE + } + z := strings.Split(r[1:], string(r[0])) + // match // and /// + if len(z) < 2 || len(z) > 3 { + return "", errNotRE + } + re, err := regexp.Compile(z[0]) + if err != nil { + return "", err + } + i := 1 + if global { + i = -1 + } + return re.ReplaceAllStringFunc(s, func(b string) string { + if i != 0 { + i-- + return z[1] + } + return b + }), nil +} diff --git a/internal/re/re_test.go b/internal/re/re_test.go new file mode 100644 index 0000000..9824392 --- /dev/null +++ b/internal/re/re_test.go @@ -0,0 +1,34 @@ +package re + +import "testing" + +func TestRE(t *testing.T) { + testCases := []struct { + r, s, x string + global bool + err error + }{ + {"/ddd/xxx/", "abd ddd xxx", "abd xxx xxx", false, nil}, + {",ddd,xxx,", "abd ddd xxx", "abd xxx xxx", false, nil}, + {"/ddd/xxx", "abd ddd xxx", "abd xxx xxx", false, nil}, + {"/x$/X", "abd ddd xxx", "abd ddd xxX", false, nil}, + {"/ /A", "abd ddd xxx", "abdAddd xxx", false, nil}, + {"/ /A", "abd ddd xxx", "abdAdddAxxx", true, nil}, + {"///", "abd ddd xxx", "abd ddd xxx", false, nil}, + {"//", "abd ddd xxx", "abd ddd xxx", false, nil}, + {"/", "abd ddd xxx", "", false, errNotRE}, + {"/1/2", "1", "2", false, nil}, + {"/^d/X", "abd ddd xxx", "abd ddd xxx", false, nil}, + } + for _, tc := range testCases { + t.Run(tc.r, func(t *testing.T) { + res, err := Replace(tc.s, tc.r, tc.global) + if err != tc.err { + t.Errorf("got %q, want %q", err, tc.err) + } + if res != tc.x { + t.Errorf("got %q, want %q", res, tc.x) + } + }) + } +} -- cgit v1.2.3