在Golang中使用替换的正则表达式

cod*_*ori 33 regex go

我用regexp包来代替波纹文本

{% macro products_list(products) %}
{% for product in products %}
productsList
{% endfor %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

但我不能代替"产品"不替换像"products_list"另一个词和Golang没有像FUNC re.ReplaceAllStringSubmatch做子匹配代替(但只是FindAllStringSubmatch).我用re.ReplaceAllString替换了"产品".

{% macro ._list(.) %}
{% for product in . %}
.List
{% endfor %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,我需要以下结果:

{% macro products_list (.) %}
{% for product in . %}
productsList
{% endfor %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 56

您可以使用具有匹配字符串边界或不匹配字符_(仍使用单词边界)的替换的捕获组:

var re = regexp.MustCompile(`(^|[^_])\bproducts\b([^_]|$)`)
s := re.ReplaceAllString(sample, `$1.$2`)
Run Code Online (Sandbox Code Playgroud)

这是Go演示正则表达式演示.

关于模式的说明:

  • (^|[^_])- 匹配字符串start(^)或除以外的字符_
  • \bproducts\b - 一句话"产品"
  • ([^_]|$)- _字符串的非结尾或结尾.

在替换模式中,我们使用反向引用来恢复使用括号(捕获组)捕获的字符.

  • `ReplaceAllString` 的其他有用语法是 `${1}.${2}`。这使您可以替换类似“${1}0${2}”的内容,否则它们将使用上述格式的“$10$2”一起运行。 (3认同)