2016-05-17 58 views
8
替換爲

我用正則表達式包更換波紋管文本正則表達式中Golang

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

,但我不能代替「產品」不替換像「products_list」另一個詞和Golang沒有像再一個FUNC .ReplaceAllStringSubmatch做替換與submatch(這裏只是FindAllStringSubmatch)。我用re.ReplaceAllString來替換「產品」。

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

這不是折騰,我想,我需要如下結果:

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

回答

11

您可以使用捕獲組匹配任何串邊界或字符不_(仍在使用單詞邊界)交替:

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

這裏是Go demoregex demo

註上的圖案:

  • (^|[^_]) - 匹配串開始(^)或大於_
  • \bproducts\b以外的字符 - 「產品」 整個字
  • ([^_]|$) - 要麼非_或者字符串的結尾。

在替換模式中,我們使用反向引用來恢復使用圓括號(捕獲組)捕獲的字符。