Допустим, у меня есть строки какЗаменить регулярное выражение submatch с помощью функции
input := `bla bla b:foo="hop" blablabla b:bar="hu?"`
, и я хочу, чтобы заменить детали между кавычками в b:foo="hop"
или b:bar="hu?"
с использованием функции.
Это легко построить регулярное выражение, чтобы получить матч и submatch, например
r := regexp.MustCompile(`\bb:\w+="([^"]+)"`)
, а затем вызвать ReplaceAllStringFunc
, но проблема в том, что обратный вызов принимает весь матч и не submatch:
fmt.Println(r.ReplaceAllStringFunc(input, func(m string) string {
// m is the whole match here. Damn.
}))
Как заменить подводку?
В настоящее время я не нашел лучшего решения, кроме как разложить себя m
внутри обратного вызова с регулярным выражением и перестроить строку после обработки отправки.
Я бы использовал альтернативный подход с положительным внешним видом, если бы они были доступны в Go, но это не так (и они не должны быть необходимы в любом случае).
Что я могу сделать здесь?
EDIT: вот мое текущее решение, которое я хотел бы упростить:
func complexFunc(s string) string {
return "dbvalue("+s+")" // this could be more complex
}
func main() {
input := `bla bla b:foo="hop" blablabla b:bar="hu?"`
r := regexp.MustCompile(`(\bb:\w+=")([^"]+)`)
fmt.Println(r.ReplaceAllStringFunc(input, func(m string) string {
parts := r.FindStringSubmatch(m)
return parts[1] + complexFunc(parts[2])
}))
}
Что беспокоит меня, что я должен применить регулярное выражение дважды. Это звучит не так.
Если вы считаете, что это дизайн ошибка, не стесняйтесь [файл] об ошибке (HTTP: // код. google.com/p/go/issues/list). – fuz
@FUZxxl Я не знаю, если это ошибка дизайна. Это не похоже на оптимальный дизайн для меня, но я могу пропустить однопроходное решение. Если другие люди здесь комментируют это, я могу записать ошибку, но мне нужны мнения. –
Подача ошибки, если у вас есть проблема почти наверняка хорошая вещь. – fuz