Golang Regex сопоставляет и заменяет первое вхождение после определенной строки - PullRequest
0 голосов
/ 27 февраля 2019

В продолжение моего предыдущего вопроса об использовании регулярных выражений Голанга для замены строк.Теперь я добавил немного сложности.Вот как выглядит контекст моего файла:

foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=*

Мне нужно заменить то, что находится между MYSTRING= и \n строкой по моему выбору (как указано в предыдущем сообщении).Я могу сделать это с помощью:

var re = regexp.MustCompile(`(MYSTRING=).*`)
s := re.ReplaceAllString(content, `${1}stringofmychoice`)

Но теперь мне нужно сопоставлять и заменять только после определенного вхождения.Так что содержимое моего файла может выглядеть примерно так:

foo:
    blahblah
    MYSTRING=foostring
bar:
    blah
    blah
    MYSTRING=barstring

ReplaceAllString, очевидно, заменяет все, что я не хочу.Есть ли способ сопоставить и заменить только первое вхождение после определенной строки?


Для получения дополнительной информации обо всем этом.Я пытаюсь написать программу для редактирования содержимого данного docker-compose.yml файла и его переменных среды.Мне нужно отредактировать переменную окружения MYSTRING по-разному, в зависимости от того, в каком сервисе она указана.В приведенном выше примере две разные службы будут foo и bar.

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете использовать ReplaceAllStringFunc и использовать регулярное выражение, например

(?m)^bar:(?:\n\s{4}.*)+

См. Демонстрационную версию regex .Он будет соответствовать блоку bar с четырьмя пробелами.Затем, после того, как совпадение получено, вы можете использовать обычный ReplaceAllString для совпадения.

См. Демонстрацию Go :

package main

import (
    "fmt"
    "regexp"
)

const sample = `foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=*`

func main() {
    re := regexp.MustCompile(`(?m)^bar:(?:\n\s{4}.*)+`)
    re_2 := regexp.MustCompile(`(MYSTRING=).*`)
    s := re.ReplaceAllStringFunc(sample, func(m string) string {
                return re_2.ReplaceAllString(m, `${1}stringofmychoice`)
        })
    fmt.Println(s)
}

Здесь, второйв блоке bar вхождение изменено:

foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=stringofmychoice
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...