I've tried to use the regexp package to replace text :
{% macro products_list(products) %}
{% for product in products %}
productsList
{% endfor %}
{% endmacro %}
I could not replace "products" without replace other words like "products_list"; and Golang has not a function like re.ReplaceAllStringSubmatch to replace with submatch (there's just FindAllStringSubmatch). I've used re.ReplaceAllString to replace "products" with .
{% macro ._list(.) %}
{% for product in . %}
.List
{% endfor %}
{% endmacro %}
But I need this result:
{% macro products_list (.) %}
{% for product in . %}
productsList
{% endfor %}
{% endmacro %}
You can use capturing groups with alternations matching either string boundaries or a character not _ (still using a word boundary):
var re = regexp.MustCompile(`(^|[^_])\bproducts\b([^_]|$)`)
s := re.ReplaceAllString(sample, `$1.$2`)
Here is the Go demo and a regex demo.
Notes on the pattern:
(^|[^_]) - match string start (^) or a character other than _\bproducts\b - a whole word "products"([^_]|$) - either a non-_ or the end of string.In the replacement pattern, we use backreferences to restore the characters captured with the parentheses (capturing groups).