From ecbbbc85efe6739d050ff2f6e8f7da5b474aebdd Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 24 Jul 2023 10:12:12 +0800 Subject: [PATCH] :sparkles: feat: strutil - add new func BeforeFirst, AfterFirst, AfterLast split funcs --- strutil/split.go | 32 ++++++++++++++++++++++++++++++++ strutil/split_test.go | 22 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/strutil/split.go b/strutil/split.go index 807139e67..1062ef7d4 100644 --- a/strutil/split.go +++ b/strutil/split.go @@ -2,6 +2,38 @@ package strutil import "strings" +// BeforeFirst get substring before first sep. +func BeforeFirst(s, sep string) string { + if i := strings.Index(s, sep); i >= 0 { + return s[:i] + } + return s +} + +// AfterFirst get substring after first sep. +func AfterFirst(s, sep string) string { + if i := strings.Index(s, sep); i >= 0 { + return s[i+len(sep):] + } + return "" +} + +// BeforeLast get substring before last sep. +func BeforeLast(s, sep string) string { + if i := strings.LastIndex(s, sep); i >= 0 { + return s[:i] + } + return s +} + +// AfterLast get substring after last sep. +func AfterLast(s, sep string) string { + if i := strings.LastIndex(s, sep); i >= 0 { + return s[i+len(sep):] + } + return "" +} + /************************************************************* * String split operation *************************************************************/ diff --git a/strutil/split_test.go b/strutil/split_test.go index d74a233f4..13a28c8c8 100644 --- a/strutil/split_test.go +++ b/strutil/split_test.go @@ -8,6 +8,28 @@ import ( "github.com/gookit/goutil/testutil/assert" ) +func TestBeforeAfter(t *testing.T) { + // BeforeFirst + assert.Eq(t, "abc", strutil.BeforeFirst("abc", ":")) + assert.Eq(t, "abc", strutil.BeforeFirst("abc:123", ":")) + assert.Eq(t, "abc", strutil.BeforeFirst("abc:123:456", ":")) + + // AfterFirst + assert.Eq(t, "", strutil.AfterFirst("abc", ":")) + assert.Eq(t, "123", strutil.AfterFirst("abc:123", ":")) + assert.Eq(t, "123:456", strutil.AfterFirst("abc:123:456", ":")) + + // BeforeLast + assert.Eq(t, "abc", strutil.BeforeLast("abc", ":")) + assert.Eq(t, "abc", strutil.BeforeLast("abc:123", ":")) + assert.Eq(t, "abc:123", strutil.BeforeLast("abc:123:456", ":")) + + // AfterLast + assert.Eq(t, "", strutil.AfterLast("abc", ":")) + assert.Eq(t, "123", strutil.AfterLast("abc:123", ":")) + assert.Eq(t, "456", strutil.AfterLast("abc:123:456", ":")) +} + func TestCut(t *testing.T) { str := "hi,inhere"