一尘不染

正则表达式与Golang中的replace

go

我用过regexp包来代替下面的文字

{% macro products_list(products) %}
{% for product in products %}
productsList
{% endfor %}
{% endmacro %}

但是我不能替换“ products”而不替换“ products_list”之类的单词,并且Golang没有像
re.ReplaceAllStringSubmatch
这样的功能可以替换为submatch(只有FindAllStringSubmatch)。我用过 re.ReplaceAllString
用替换“产品”。

{% macro ._list(.) %}
{% for product in . %}
.List
{% endfor %}
{% endmacro %}

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

{% macro products_list (.) %}
{% for product in . %}
productsList
{% endfor %}
{% endmacro %}

阅读 352

收藏
2020-07-02

共1个答案

一尘不染

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

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

这是Go演示regex演示

关于模式的注释:

  • (^|[^_])-匹配字符串开头(^)或非_
  • \bproducts\b -整个词“产品”
  • ([^_]|$)-非_字符串或字符串结尾。

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

2020-07-02