aboutsummaryrefslogtreecommitdiff
path: root/src/bytes
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2018-09-26 20:19:11 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2018-09-26 20:51:23 +0000
commitebdc0b8d68e04ad383088c8b3ab963de4a9b5c5d (patch)
treec6ccca03228b99d0042fd0d18ac91c9380355d40 /src/bytes
parent5a8c11ce3e7a87485defafb78c7bcf14f9d7b5a2 (diff)
downloadgo-ebdc0b8d68e04ad383088c8b3ab963de4a9b5c5d.tar.gz
go-ebdc0b8d68e04ad383088c8b3ab963de4a9b5c5d.zip
bytes, strings: add ReplaceAll
Credit to Harald Nordgren for the proposal in https://golang.org/cl/137456 and #27864. Fixes #27864 Change-Id: I80546683b0623124fe4627a71af88add2f6c1c27 Reviewed-on: https://go-review.googlesource.com/137855 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/bytes')
-rw-r--r--src/bytes/bytes.go9
-rw-r--r--src/bytes/bytes_test.go6
2 files changed, 15 insertions, 0 deletions
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index 876fa3c1ed..6492db088a 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -774,6 +774,15 @@ func Replace(s, old, new []byte, n int) []byte {
return t[0:w]
}
+// ReplaceAll returns a copy of the slice s with all
+// non-overlapping instances of old replaced by new.
+// If old is empty, it matches at the beginning of the slice
+// and after each UTF-8 sequence, yielding up to k+1 replacements
+// for a k-rune slice.
+func ReplaceAll(s, old, new []byte) []byte {
+ return Replace(s, old, new, -1)
+}
+
// EqualFold reports whether s and t, interpreted as UTF-8 strings,
// are equal under Unicode case-folding.
func EqualFold(s, t []byte) bool {
diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go
index 55a22bae22..f4c0ffd2a9 100644
--- a/src/bytes/bytes_test.go
+++ b/src/bytes/bytes_test.go
@@ -1362,6 +1362,12 @@ func TestReplace(t *testing.T) {
if cap(in) == cap(out) && &in[:1][0] == &out[:1][0] {
t.Errorf("Replace(%q, %q, %q, %d) didn't copy", tt.in, tt.old, tt.new, tt.n)
}
+ if tt.n == -1 {
+ out := ReplaceAll(in, []byte(tt.old), []byte(tt.new))
+ if s := string(out); s != tt.out {
+ t.Errorf("ReplaceAll(%q, %q, %q) = %q, want %q", tt.in, tt.old, tt.new, s, tt.out)
+ }
+ }
}
}