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