summaryrefslogtreecommitdiff
path: root/regexp
diff options
context:
space:
mode:
Diffstat (limited to 'regexp')
-rw-r--r--regexp/regexp.go44
-rw-r--r--regexp/regexp_test.go98
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)
+ }
+}