diff options
Diffstat (limited to 'regexp')
| -rw-r--r-- | regexp/regexp.go | 44 | ||||
| -rw-r--r-- | regexp/regexp_test.go | 98 |
2 files changed, 132 insertions, 10 deletions
diff --git a/regexp/regexp.go b/regexp/regexp.go index 8aeaa43c..a6cadc74 100644 --- a/regexp/regexp.go +++ b/regexp/regexp.go @@ -2,10 +2,22 @@ package regexp import stdre "regexp" -// Replace - -func Replace(expression, replacement, input string) string { - re := stdre.MustCompile(expression) - return re.ReplaceAllString(input, replacement) +// Find - +func Find(expression, input string) (string, error) { + re, err := stdre.Compile(expression) + if err != nil { + return "", err + } + return re.FindString(input), nil +} + +// FindAll - +func FindAll(expression string, n int, input string) ([]string, error) { + re, err := stdre.Compile(expression) + if err != nil { + return nil, err + } + return re.FindAllString(input, n), nil } // Match - @@ -13,3 +25,27 @@ func Match(expression, input string) bool { re := stdre.MustCompile(expression) return re.MatchString(input) } + +// Replace - +func Replace(expression, replacement, input string) string { + re := stdre.MustCompile(expression) + return re.ReplaceAllString(input, replacement) +} + +// ReplaceLiteral - +func ReplaceLiteral(expression, replacement, input string) (string, error) { + re, err := stdre.Compile(expression) + if err != nil { + return "", err + } + return re.ReplaceAllLiteralString(input, replacement), nil +} + +// Split - +func Split(expression string, n int, input string) ([]string, error) { + re, err := stdre.Compile(expression) + if err != nil { + return nil, err + } + return re.Split(input, n), nil +} diff --git a/regexp/regexp_test.go b/regexp/regexp_test.go index 15adccd4..89f6cb86 100644 --- a/regexp/regexp_test.go +++ b/regexp/regexp_test.go @@ -6,18 +6,104 @@ import ( "github.com/stretchr/testify/assert" ) -func TestReplace(t *testing.T) { - assert.Equal(t, "-T-T-", Replace("a(x*)b", "T", "-ab-axxb-")) - assert.Equal(t, "--xx-", Replace("a(x*)b", "$1", "-ab-axxb-")) - assert.Equal(t, "---", Replace("a(x*)b", "$1W", "-ab-axxb-")) - assert.Equal(t, "-W-xxW-", Replace("a(x*)b", "${1}W", "-ab-axxb-")) +func TestFind(t *testing.T) { + f, err := Find(`[a-z]+`, `foo bar baz`) + assert.NoError(t, err) + assert.Equal(t, "foo", f) - assert.Equal(t, "Turing, Alan", Replace("(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)", "${last}, ${first}", "Alan Turing")) + _, err = Find(`[a-`, "") + assert.Error(t, err) } +func TestFindAll(t *testing.T) { + _, err := FindAll(`[a-`, 42, "") + assert.Error(t, err) + + testdata := []struct { + re string + n int + in string + expected []string + }{ + {`[a-z]+`, -1, `foo bar baz`, []string{"foo", "bar", "baz"}}, + {`[a-z]+`, 0, `foo bar baz`, nil}, + {`[a-z]+`, 2, `foo bar baz`, []string{"foo", "bar"}}, + {`[a-z]+`, 14, `foo bar baz`, []string{"foo", "bar", "baz"}}, + } + + for _, d := range testdata { + f, err := FindAll(d.re, d.n, d.in) + assert.NoError(t, err) + assert.EqualValues(t, d.expected, f) + } +} func TestMatch(t *testing.T) { assert.True(t, Match(`^[a-z]+\[[0-9]+\]$`, "adam[23]")) assert.True(t, Match(`^[a-z]+\[[0-9]+\]$`, "eve[7]")) assert.False(t, Match(`^[a-z]+\[[0-9]+\]$`, "Job[48]")) assert.False(t, Match(`^[a-z]+\[[0-9]+\]$`, "snakey")) } + +func TestReplace(t *testing.T) { + testdata := []struct { + expected string + expression string + replacement string + input string + }{ + {"-T-T-", "a(x*)b", "T", "-ab-axxb-"}, + {"--xx-", "a(x*)b", "$1", "-ab-axxb-"}, + {"---", "a(x*)b", "$1W", "-ab-axxb-"}, + {"-W-xxW-", "a(x*)b", "${1}W", "-ab-axxb-"}, + {"Turing, Alan", "(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)", "${last}, ${first}", "Alan Turing"}, + } + for _, d := range testdata { + assert.Equal(t, d.expected, Replace(d.expression, d.replacement, d.input)) + } +} + +func TestReplaceLiteral(t *testing.T) { + _, err := ReplaceLiteral(`[a-`, "", "") + assert.Error(t, err) + + testdata := []struct { + expected string + expression string + replacement string + input string + }{ + {"-T-T-", "a(x*)b", "T", "-ab-axxb-"}, + {"-$1-$1-", "a(x*)b", "$1", "-ab-axxb-"}, + {"-$1W-$1W-", "a(x*)b", "$1W", "-ab-axxb-"}, + {"-${1}W-${1}W-", "a(x*)b", "${1}W", "-ab-axxb-"}, + {"${last}, ${first}", "(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)", "${last}, ${first}", "Alan Turing"}, + } + for _, d := range testdata { + r, err := ReplaceLiteral(d.expression, d.replacement, d.input) + assert.NoError(t, err) + assert.Equal(t, d.expected, r) + } +} + +func TestSplit(t *testing.T) { + _, err := Split(`[a-`, 42, "") + assert.Error(t, err) + + testdata := []struct { + re string + n int + in string + expected []string + }{ + {`\s+`, -1, "foo bar baz\tqux", []string{"foo", "bar", "baz", "qux"}}, + {`,`, 0, `foo bar baz`, nil}, + {` `, 2, `foo bar baz`, []string{"foo", "bar baz"}}, + {`[\s,.]`, 14, `foo bar.baz,qux`, []string{"foo", "bar", "baz", "qux"}}, + } + + for _, d := range testdata { + f, err := Split(d.re, d.n, d.in) + assert.NoError(t, err) + assert.EqualValues(t, d.expected, f) + } +} |
