Golang регулярное выражение для замены строки - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь создать регулярное выражение для замены строки из содержимого, прочитанного из файла

control_plane_ignition = <<END_OF_MASTER_IGNITION
{"ignition":"igntext"}
END_OF_MASTER_IGNITION

мой код для замены:

masterContent := `new-igncontent`
var workerRe = regexp.MustCompile(`END_OF_MASTER_IGNITION\s(.*)\sEND_OF_MASTER_IGNITION`)
s = workerRe.ReplaceAllString(string(teraformtfvarContent), string(masterContent))

Ожидается:

control_plane_ignition = <<END_OF_MASTER_IGNITION
new-igncontent
END_OF_MASTER_IGNITION

Факт:

control_plane_ignition = <<new-igncontent

Кто-нибудь может мне здесь помочь?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

При поиске END_OF_MASTER_IGNITION\s(.*)\sEND_OF_MASTER_IGNITION вся эта подстрока будет заменена. Таким образом, чтобы сохранить некоторые его фрагменты, вы можете захватить их и обратиться к ним с обратными ссылками, такими как ${1} 1 .

Вам также следует искать (.*?) вместо (.*), в противном случае вы замените все между первым начальным тегом и последним конечным тегом, а это не то, что вам нужно.

Например, вот так

var workerRe = regexp.MustCompile(`(?s)(\bEND_OF_MASTER_IGNITION\s+)(.*?)(\s+END_OF_MASTER_IGNITION\b)`)

s = workerRe.ReplaceAllString(content, "${1}"+regexp.QuoteMeta(masterContent)+"${3}")

https://play.golang.org/p/X7Gm6ClFNPD

Вывод:

control_plane_ignition = <<END_OF_MASTER_IGNITION
new-igncontent
END_OF_MASTER_IGNITION

1 предостережение: из-за особенностей реализации регулярного выражения Go избегайте использования обратных ссылок, таких как $1 и всегда пишите их как ${1}. $1 «связывается» даже с нецифровыми значениями и в случае $1new-... может стать ${1new}-....

0 голосов
/ 11 апреля 2020

Я думаю, вы просите заменить строку, начинающуюся с END_OF_MASTER_IGNITION и заканчивающуюся END_OF_MASTER_IGNITION на masterContent, так что это то, что вы получаете.

Если бы вы включили END_OF_MASTER_IGNITION с обеих сторон вашей строки замены, вы получите желаемый эффект:

    control_plane_ignition := `<<END_OF_MASTER_IGNITION
{"ignition":"igntext"}
END_OF_MASTER_IGNITION`

    masterContent := `new-igncontent`
    workerRe := regexp.MustCompile(`END_OF_MASTER_IGNITION\n(.*)\nEND_OF_MASTER_IGNITION`)
    s := workerRe.ReplaceAllString(string(control_plane_ignition), 
           "END_OF_MASTER_IGNITION\n" + masterContent + "\nEND_OF_MASTER_IGNITION")

https://play.golang.org/p/abyZd4E2uIg

PS: Обратите внимание на мои небольшие изменения в регулярном выражении, оно не компилировалось так, как вы его опубликовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...