我用过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 %}
您可以使用具有交替匹配字符串边界或不匹配字符的捕获组_(仍使用单词边界):
_
var re = regexp.MustCompile(`(^|[^_])\bproducts\b([^_]|$)`) s := re.ReplaceAllString(sample, `$1.$2`)
这是Go演示和regex演示。
关于模式的注释:
(^|[^_])
^
\bproducts\b
([^_]|$)
在替换模式中,我们使用向后引用来恢复用括号捕获的字符(捕获组)。