From b58d374396d77710c17f3159ce4a3c9d342a7af7 Mon Sep 17 00:00:00 2001 From: Fufu Date: Wed, 30 Oct 2024 08:37:41 +0800 Subject: [PATCH] feat: add LastString() and FirstString() --- strings.go | 18 +++++++++++++++ strings_test.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/strings.go b/strings.go index f2860a5..5ab389c 100644 --- a/strings.go +++ b/strings.go @@ -363,3 +363,21 @@ func TruncStr(s string, maxLen int, suffix string) string { } return s[:i] + suffix } + +// LastString 获取文本内容最后一个分隔符(单字节: sep[0])后的内容 +func LastString(s, sep string) string { + idx := strings.LastIndex(s, sep) + if idx != -1 && idx+1 < len(s) { + return s[idx+1:] + } + return "" +} + +// FirstString 获取文本内容第一个分隔符(单字节: sep[0])前的内容 +func FirstString(s, sep string) string { + idx := strings.Index(s, sep) + if idx != -1 { + return s[:idx] + } + return "" +} diff --git a/strings_test.go b/strings_test.go index 37fa462..eae82a7 100644 --- a/strings_test.go +++ b/strings_test.go @@ -632,3 +632,62 @@ func TestTruncStr(t *testing.T) { assert.NotEqual(t, TruncStr(ss, 10, ""), ss[:10]) } + +func TestLastString(t *testing.T) { + t.Parallel() + ss := "Hello,世界!😄,f f" + for _, tt := range []struct { + sep string + want string + }{ + {",", "f f"}, + {"H", "ello,世界!😄,f f"}, + {"o", ",世界!😄,f f"}, + {" ", "f"}, + + // 注意: + {"el", "llo,世界!😄,f f"}, + + {",,", ""}, + {"E", ""}, + {"f", ""}, + } { + assert.Equal(t, tt.want, LastString(ss, tt.sep)) + } + + assert.NotEqual(t, ",f f", LastString(ss, "😄")) + assert.Equal(t, "\nc", LastString("a\n\nb\n\nc", "\n\n")) + + assert.Equal(t, "c", LastString("a\nb\nc", "\n")) + assert.Equal(t, "", LastString("a\nb\nc\n", "\n")) + assert.Equal(t, "c", LastString(strings.TrimSpace("a\nb\nc\n"), "\n")) +} + +func TestFirstString(t *testing.T) { + t.Parallel() + ss := "Hello,世界!😄,f f" + for _, tt := range []struct { + sep string + want string + }{ + {",", "Hello,世界!😄"}, + {"o", "Hell"}, + {" ", "Hello,世界!😄,f"}, + + // 注意: + {"el", "H"}, + + {",,", ""}, + {"E", ""}, + {"H", ""}, + } { + assert.Equal(t, tt.want, FirstString(ss, tt.sep)) + } + + assert.Equal(t, "Hello,世界!", FirstString(ss, "😄")) + assert.Equal(t, "a", FirstString("a\n\nb\n\nc", "\n\n")) + + assert.Equal(t, "a", FirstString("a\nb\nc", "\n")) + assert.Equal(t, "", FirstString("\na\nb\nc", "\n")) + assert.Equal(t, "a", FirstString(strings.TrimSpace("\na\nb\nc\n"), "\n")) +}