Как заменить символ в Go с помощью функции ReplaceAll пакета Regexp? - PullRequest
1 голос
/ 15 ноября 2009

Я не знаком с C-подобными синтаксисами и хотел бы написать код, чтобы найти и заменить, скажем, все буквы «A» на «B» в исходной строке, скажем «ABBA» с пакетом Regexp ReplaceAll или функциями ReplaceAllString? Как мне настроить тип Regexp, src и repl? Вот фрагмент кода ReplaceAll из документации Go:

// ReplaceAll returns a copy of src in which all matches for the Regexp
// 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 {
    lastMatchEnd := 0; // end position of the most recent match
    searchPos := 0;    // position where we next look for a match
    buf := new(bytes.Buffer);
    for searchPos <= len(src) {
        a := re.doExecute("", src, searchPos);
        if len(a) == 0 {
            break // no more matches
        }</p>

<code>    // 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();
</code>

}

Ответы [ 2 ]

3 голосов
/ 15 ноября 2009

Это обычная процедура, чтобы делать то, что вы хотите:

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);
}
1 голос
/ 15 ноября 2009

Вот небольшой пример. Вы также можете найти хорошие примеры в тестовом классе 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...