【问题标题】:Golang Regex match and replace first occurrence after a certain stringGolang Regex匹配并替换某个字符串后的第一次出现
【发布时间】:2019-02-27 08:28:41
【问题描述】:

跟进我之前的 question 关于使用 Golang 的正则表达式在字符串之间替换的内容。我现在添加了一些复杂性。以下是我的文件的上下文:

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。在上面的示例中,两个不同的服务将是 foobar

【问题讨论】:

  • 您是否必须捕获MYSTRING=,然后在替换模式中使用反向引用?你能硬编码MYSTRING=吗?
  • 是的,我可以硬核MYSTRING=
  • 当正则表达式不再是解决问题的最佳方案时,comes a time...

标签: regex go


【解决方案1】:

您可以使用ReplaceAllStringFunc 并使用类似的正则表达式

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

请参阅regex demo。它将匹配一个缩进有四个空格的bar 块。然后,获得匹配后,您可以在匹配上使用正则ReplaceAllString

Go demo

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

【讨论】:

  • 抱歉,我想我的问题措辞可能有点过于混乱。我的意思是说我需要在 certain 字符串出现之后将MYSTRING=* 替换为MYSTRING=stringofmychoice,而不是在它出现一定次数之后。在上面的示例中,该 certain 字符串将是 bar。我想找一个字符串bar,把后面的MYSTRING=*改成MYSTRING=barstring
  • @thestateofmay 变化不大。
  • 会不会贪婪地使用barMYSTRING=之间的匹配呢?我正在尝试类似re := regexp.MustCompile("(bar).(MYSTRING=).*") 但它不起作用。
  • @thestateofmay re := regexp.MustCompile("((?s:bar.*?MYSTRING=)).*")。虽然不确定你的意思。如果您打算将其用作 1-regex 解决方案,watch out。由于没有前瞻支持,因此很难为此提出一个有效且可读的正则表达式。
猜你喜欢
  • 2016-09-08
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多