web-dev-qa-db-ja.com

Golangの置換付き正規表現

正規表現パッケージを使用して、以下のテキストを置き換えました

{% 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 %}
28
coditori

文字列の境界または_以外の文字(まだWordの境界を使用)に一致する選択肢を持つキャプチャグループを使用できます。

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

Go demo および regex demo です。

パターンに関する注意:

  • (^|[^_])-文字列の開始(^)または_以外の文字に一致
  • \bproducts\b-Word全体の「製品」
  • ([^_]|$)-非_または文字列の終わり。

置換パターンでは、後方参照を使用して、かっこ(キャプチャグループ)でキャプチャされた文字を復元します。

51