web-dev-qa-db-fra.com

Regex avec replace à Golang

J'ai utilisé le paquet regexp pour remplacer le texte ci-dessous

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

mais je ne pourrais pas remplacer "produits" sans remplacer des mots tels que "products_list" et Golang n'a pas une fonction comme re.ReplaceAllStringSubmatch à faire remplacer par submatch (il n'y a que FindAllStringSubmatch). J'ai utilisé re.ReplaceAllString pour remplacer "produits" par.

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

Ce n'est pas ça que je veux et j'ai besoin de résultat ci-dessous:

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

Vous pouvez utiliser des groupes de capture avec des alternances correspondant aux limites de la chaîne ou à un caractère non _ _ (toujours en utilisant une limite de Word):

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

Voici le Lancer la démo et un démo regex .

Notes sur le motif:

  • (^|[^_]) - correspond au début de la chaîne (^) ou un caractère autre que _
  • \bproducts\b _ un mot entier "produits"
  • ([^_]|$) - soit un non -_ ou la fin de la chaîne.

Dans le modèle de remplacement, nous utilisons des références arrière pour restaurer les caractères capturés avec les parenthèses (groupes de capture).

51