regexstringgoreplace

Replace with regex in Golang


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 %}

Solution

  • 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:

    In the replacement pattern, we use backreferences to restore the characters captured with the parentheses (capturing groups).