1

我不熟悉类似 C 的语法,想编写代码来查找和替换源字符串中的所有“A”到“B”,比如使用 Regexp 包 ReplaceAll 或 ReplaceAllString 函数的“ABBA”?如何设置类型 Regexp、src 和 repl?这是 Go 文档中的 ReplaceAll代码片段

// ReplaceAll 返回 src 的副本,其中所有匹配正则表达式
// 已经被repl替换了。不支持表达式
//(例如 \1 或 $1)在替换文本中。
func (re *Regexp) ReplaceAll(src, repl []byte) []byte {
    最后匹配结束:= 0;// 最近匹配的结束位置
    搜索位置:= 0;// 我们下一次寻找匹配的位置
    buf := new(bytes.Buffer);
    对于 searchPos <= len(src) {
        a := re.doExecute("", src, searchPos);
        如果 len(a) == 0 {
            break // 不再匹配
        }

// Copy the unmatched characters before this match. buf.Write(src[lastMatchEnd:a[0]]); // Now insert a copy of the replacement string, but not for a // match of the empty string immediately after another match. // (Otherwise, we get double replacement for patterns that // match both empty and nonempty strings.) if a[1] > lastMatchEnd || a[0] == 0 { buf.Write(repl) } lastMatchEnd = a[1]; // Advance past this match; always advance at least one character. _, width := utf8.DecodeRune(src[searchPos:len(src)]); if searchPos+width > a[1] { searchPos += width } else if searchPos+1 > a[1] { // This clause is only needed at the end of the input // string. In that case, DecodeRuneInString returns width=0. searchPos++ } else { searchPos = a[1] } } // Copy the unmatched characters after the last match. buf.Write(src[lastMatchEnd:len(src)]); return buf.Bytes();

}

4

2 回答 2

4

这是做你想做的事的例行公事:

package main
import ("fmt"; "regexp"; "os"; "strings";);
func main () {
    reg, error := regexp.Compile ("B");
    if error != nil {
        fmt.Printf ("Compile failed: %s", error.String ());
        os.Exit (1);
    }
    output := string (reg.ReplaceAll (strings.Bytes ("ABBA"),
                      strings.Bytes ("A")));
    fmt.Println (output);
}
于 2009-11-15T17:17:15.493 回答
1

这是一个小例子。您还可以在他的Regexp 测试类中找到很好的示例

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re, _ := regexp.Compile("e")
    input := "hello"
    replacement := "a"
    actual := string(re.ReplaceAll(strings.Bytes(input), strings.Bytes(replacement)))
    fmt.Printf("new pattern %s", actual)
}
于 2009-11-15T17:28:54.267 回答