Regex with replace in Golang

RegexGo

Regex Problem Overview


I've used regexp package to replace bellow text

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

but I could not replace "products" without replace another words like "products_list" and Golang has no a func like re.ReplaceAllStringSubmatch to do replace with submatch (there's just FindAllStringSubmatch). I've used re.ReplaceAllString to replace "products" with .

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

It's not sth which I want and I need below result:

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

Regex Solutions


Solution 1 - Regex

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).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncoditoriView Question on Stackoverflow
Solution 1 - RegexWiktor StribiżewView Answer on Stackoverflow