我使用 regexp 包来替换下面的文本
{% macro products_list(products) %}
{% for product in products %}
productsList
{% endfor %}
{% endmacro %}
我无法在不替换“products_list”等其他单词的情况下替换“products”,并且 Golang 没有类似的功能re.ReplaceAllStringSubmatch替换为子匹配(只有 FindAllStringSubmatch)。我用过re.ReplaceAllString将“产品”替换为 .
{% macro ._list(.) %}
{% for product in . %}
.List
{% endfor %}
{% endmacro %}
但我需要这个结果:
{% macro products_list (.) %}
{% for product in . %}
productsList
{% endfor %}
{% endmacro %}
您可以使用捕获组,其交替匹配字符串边界或不匹配的字符_
(仍然使用单词边界):
var re = regexp.MustCompile(`(^|[^_])\bproducts\b([^_]|$)`)
s := re.ReplaceAllString(sample, `$1.$2`)
这里是Go demo https://play.golang.org/p/4_KSyonY9y and a 正则表达式演示 https://regex101.com/r/pL0uR0/1.
图案注意事项:
-
(^|[^_])
- 匹配字符串开始(^
) 或除_
-
\bproducts\b
- 一个完整的词“产品”
-
([^_]|$)
- 要么是非_
或字符串的末尾。
在替换模式中,我们使用反向引用来恢复用括号捕获的字符(捕获组)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)