diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2013-10-24 15:51:19 -0700 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2013-10-24 15:51:19 -0700 |
commit | fb7ccddb0795c0e6f1a17866509fcfb63d6f069d (patch) | |
tree | 592c03e661392a59c0e1a71f1ea692109c55868a /src/pkg/strings | |
parent | d2911418c21e376d325be80bc6455581088cc56c (diff) | |
download | go-fb7ccddb0795c0e6f1a17866509fcfb63d6f069d.tar.gz |
strings: fix Replacer bug with prefix matches
singleStringReplacer had a bug where if a string was replaced
at the beginning and no output had yet been produced into the
temp buffer before matching ended, an invalid nil check (used
as a proxy for having matched anything) meant it always
returned its input.
Fixes issue 6659
R=golang-dev, r
CC=golang-dev
https://codereview.appspot.com/16880043
Diffstat (limited to 'src/pkg/strings')
-rw-r--r-- | src/pkg/strings/replace.go | 5 | ||||
-rw-r--r-- | src/pkg/strings/replace_test.go | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/pkg/strings/replace.go b/src/pkg/strings/replace.go index f63b1792c..54c9323e0 100644 --- a/src/pkg/strings/replace.go +++ b/src/pkg/strings/replace.go @@ -364,17 +364,18 @@ func makeSingleStringReplacer(pattern string, value string) *singleStringReplace func (r *singleStringReplacer) Replace(s string) string { var buf []byte - i := 0 + i, matched := 0, false for { match := r.finder.next(s[i:]) if match == -1 { break } + matched = true buf = append(buf, s[i:i+match]...) buf = append(buf, r.value...) i += match + len(r.finder.pattern) } - if buf == nil { + if !matched { return s } buf = append(buf, s[i:]...) diff --git a/src/pkg/strings/replace_test.go b/src/pkg/strings/replace_test.go index d33dea95b..82e4b6ef0 100644 --- a/src/pkg/strings/replace_test.go +++ b/src/pkg/strings/replace_test.go @@ -261,10 +261,21 @@ func TestReplacer(t *testing.T) { testCases = append(testCases, testCase{abcMatcher, "", ""}, testCase{abcMatcher, "ab", "ab"}, + testCase{abcMatcher, "abc", "[match]"}, testCase{abcMatcher, "abcd", "[match]d"}, testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"}, ) + // Issue 6659 cases (more single string replacer) + + noHello := NewReplacer("Hello", "") + testCases = append(testCases, + testCase{noHello, "Hello", ""}, + testCase{noHello, "Hellox", "x"}, + testCase{noHello, "xHello", "x"}, + testCase{noHello, "xHellox", "xx"}, + ) + // No-arg test cases. nop := NewReplacer() |