Today I wanted to remove, from a string, the substring starting with a specified string.
For a line of code with a comment started with #, I wanted to remove everything starting at #, so the line “line with #comm#ent” should become “line with “.
The test for this is:
func TestRemoveFromStringAfter(t *testing.T) {
tests := []struct {
input,
after,
expected string
}{
{
input: "line with #comm#ent",
after: "#",
expected: "line with ",
},
{
input: "line to clean",
after: "abc",
expected: "line to clean",
},
{
input: "line to clean",
after: "l",
expected: "",
},
{
input: "",
after: "",
expected: "",
},
{
input: " ",
after: "",
expected: " ",
},
}
for i, test := range tests {
result := RemoveFromStringAfter(test.input, test.after)
if result != test.expected {
t.Fatalf("Failed at test: %d", i)
}
}
}
I tried to use TrimSuffix and TrimFunc from the strings package, but they weren’t getting me where I wanted. Then, all of a sudden, it stroke me: a string can be treated as a slice and a subslice is what I need. A subslice which ends right before the position of the suffix I give.
So I take the position of the suffix and extract a substring of the input string:
func RemoveFromStringAfter(input, after string) string {
if after == "" {
return input
}
if index := strings.Index(input, after); index > -1 {
input = input[:index]
}
return input
}