bytes, strings: add Replace

This is the Replace I suggested in the review of CL 1114041.
It's true that we already have

	regexp.MustCompile(regexp.QuoteMeta(old)).ReplaceAll(s, new)

but because this Replace is doing a simpler job it is
simpler to call and inherently more efficient.

I will add the bytes implementation and tests to the
CL after the strings one has been reviewed.

R=r, cw
CC=golang-dev
https://golang.org/cl/1731048
This commit is contained in:
Russ Cox 2010-06-30 18:03:09 -07:00
parent 269df58270
commit 0bf413ab8e
4 changed files with 153 additions and 0 deletions

View file

@ -645,3 +645,39 @@ func TestTrimFunc(t *testing.T) {
}
}
}
type ReplaceTest struct {
in string
old, new string
n int
out string
}
var ReplaceTests = []ReplaceTest{
ReplaceTest{"hello", "l", "L", 0, "heLLo"},
ReplaceTest{"hello", "x", "X", 0, "hello"},
ReplaceTest{"", "x", "X", 0, ""},
ReplaceTest{"radar", "r", "<r>", 0, "<r>ada<r>"},
ReplaceTest{"", "", "<>", 0, "<>"},
ReplaceTest{"banana", "a", "<>", 0, "b<>n<>n<>"},
ReplaceTest{"banana", "a", "<>", 1, "b<>nana"},
ReplaceTest{"banana", "a", "<>", 1000, "b<>n<>n<>"},
ReplaceTest{"banana", "an", "<>", 0, "b<><>a"},
ReplaceTest{"banana", "ana", "<>", 0, "b<>na"},
ReplaceTest{"banana", "", "<>", 0, "<>b<>a<>n<>a<>n<>a<>"},
ReplaceTest{"banana", "", "<>", 10, "<>b<>a<>n<>a<>n<>a<>"},
ReplaceTest{"banana", "", "<>", 6, "<>b<>a<>n<>a<>n<>a"},
ReplaceTest{"banana", "", "<>", 5, "<>b<>a<>n<>a<>na"},
ReplaceTest{"banana", "", "<>", 1, "<>banana"},
ReplaceTest{"banana", "a", "a", 0, "banana"},
ReplaceTest{"banana", "a", "a", 1, "banana"},
ReplaceTest{"☺☻☹", "", "<>", 0, "<>☺<>☻<>☹<>"},
}
func TestReplace(t *testing.T) {
for _, tt := range ReplaceTests {
if s := string(Replace([]byte(tt.in), []byte(tt.old), []byte(tt.new), tt.n)); s != tt.out {
t.Errorf("Replace(%q, %q, %q, %d) = %q, want %q", tt.in, tt.old, tt.new, tt.n, s, tt.out)
}
}
}