Замена первого совпадения в Go
Команда замены всех меняет каждое вхождение. Чтобы тронуть только первое, находят его индексы и собирают строку из частей до, замены и после.
Второй прием: передать функцию замены, которая меняет текст только один раз, а дальше возвращает исходный фрагмент:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\d`)
txt := "1 2 3 4 5"
loc := re.FindStringIndex(txt)
if loc != nil {
res := txt[:loc[0]] + "!" + txt[loc[1]:]
fmt.Println(res)
}
done := false
res2 := re.ReplaceAllStringFunc(txt, func(s string) string {
if done {
return s
}
done = true
return "!"
})
fmt.Println(res2)
}
Дана строка:
txt := "cat cat dog"
Замените только первое "cat" на "pet".
Дана строка:
txt := "a1a2a3"
Замените первую цифру на "X" через индексы.
Дана строка:
txt := "z z z"
Скажите, сколько раз вызовется функция при втором способе.