diff options
author | Andrew Gerrand <adg@golang.org> | 2010-03-07 12:41:49 +1100 |
---|---|---|
committer | Andrew Gerrand <adg@golang.org> | 2010-03-07 12:41:49 +1100 |
commit | 9f400b186a2cf9b2d5668ae72e34deb5f023a9d3 (patch) | |
tree | 2c669617346841d17cd4b79b0d078ae6ac4cd5a5 /src/pkg/regexp/regexp.go | |
parent | a3a0f935da5012e6bc31858e1c25f3a5c42a206c (diff) | |
download | golang-9f400b186a2cf9b2d5668ae72e34deb5f023a9d3.tar.gz |
regexp: add ReplaceAllFunc and ReplaceAllStringFunc
R=r
CC=golang-dev
http://codereview.appspot.com/247041
Committer: Andrew Gerrand <adg@golang.org>
Diffstat (limited to 'src/pkg/regexp/regexp.go')
-rw-r--r-- | src/pkg/regexp/regexp.go | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/pkg/regexp/regexp.go b/src/pkg/regexp/regexp.go index b3525396c..216e80516 100644 --- a/src/pkg/regexp/regexp.go +++ b/src/pkg/regexp/regexp.go @@ -1006,6 +1006,14 @@ func Match(pattern string, b []byte) (matched bool, error os.Error) { // have been replaced by repl. No support is provided for expressions // (e.g. \1 or $1) in the replacement string. func (re *Regexp) ReplaceAllString(src, repl string) string { + return re.ReplaceAllStringFunc(src, func(string) string { return repl }) +} + +// ReplaceAllStringFunc returns a copy of src in which all matches for the +// Regexp have been replaced by the return value of of function repl (whose +// first argument is the matched string). No support is provided for +// expressions (e.g. \1 or $1) in the replacement string. +func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string { lastMatchEnd := 0 // end position of the most recent match searchPos := 0 // position where we next look for a match buf := new(bytes.Buffer) @@ -1023,7 +1031,7 @@ func (re *Regexp) ReplaceAllString(src, repl string) string { // (Otherwise, we get double replacement for patterns that // match both empty and nonempty strings.) if a[1] > lastMatchEnd || a[0] == 0 { - io.WriteString(buf, repl) + io.WriteString(buf, repl(src[a[0]:a[1]])) } lastMatchEnd = a[1] @@ -1050,6 +1058,14 @@ func (re *Regexp) ReplaceAllString(src, repl string) string { // have been replaced by repl. No support is provided for expressions // (e.g. \1 or $1) in the replacement text. func (re *Regexp) ReplaceAll(src, repl []byte) []byte { + return re.ReplaceAllFunc(src, func([]byte) []byte { return repl }) +} + +// ReplaceAllFunc returns a copy of src in which all matches for the +// Regexp have been replaced by the return value of of function repl (whose +// first argument is the matched []byte). No support is provided for +// expressions (e.g. \1 or $1) in the replacement string. +func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte { lastMatchEnd := 0 // end position of the most recent match searchPos := 0 // position where we next look for a match buf := new(bytes.Buffer) @@ -1067,7 +1083,7 @@ func (re *Regexp) ReplaceAll(src, repl []byte) []byte { // (Otherwise, we get double replacement for patterns that // match both empty and nonempty strings.) if a[1] > lastMatchEnd || a[0] == 0 { - buf.Write(repl) + buf.Write(repl(src[a[0]:a[1]])) } lastMatchEnd = a[1] |