Go 標準ライブラリの regexp.ReplaceAllString は、通常の規則に基づいて部分文字列を置換する柔軟な方法を提供します。表現パターン。しかし、その動作を理解することは、次のような複雑な出力で示されているように、不可解な場合があります:
<code class="go">re := regexp.MustCompile("a(x*)b") fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "W")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))</code>
出力は次のとおりです:
-T-T- --xx- - -W-xxW-
最初のケースは明らかですが、後の 3 つは混乱します。
置換の説明
鍵となるのは、置換パターンにおける $ の役割を理解することです。ドキュメントによると、$ は text/template の Expand 関数のように解釈されます。
Expand では、$name は変数を参照し、見つからないか初期化されていない場合は、空の文字列に置き換えられます。
結果 #2 (${1})
${1} は、最初のキャプチャ グループ (x*) を参照します。入力文字列では、このグループは「xx」と一致し、出力として「--xx-」が返されます。
結果 #3 (${1}W)
ここで、${1}W は「最初の」キャプチャ グループ (x*) を参照し、「W」を追加します。ただし、パターンには「1W」という明示的なグループがないため、初期化されません。したがって、空の文字列に置き換えられ、「-」が生成されます。
結果 #4 (${1}W と名前付きキャプチャ)
代わりに、名前付きキャプチャを使用して置換パターンを明確にすることができます:
<code class="go">re := regexp.MustCompile("a(?P<1W>x*)b") fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))</code>
この場合、「$1W」は「xx」をキャプチャする名前付き 1W グループを指します。したがって、出力は「-W-xxW-」になります。
結論
「$」の具体的な処理と名前付きキャプチャの役割を理解することが重要です。 regexp.ReplaceAllString の動作を解読するため。置換パターンを慎重に調整することで、開発者は Go プログラムで部分文字列置換を正確に制御できます。
以上がここでは、出力の不可解な性質を念頭に置いて、質問ベースのタイトルをいくつか示します。 オプション 1 (パズルに集中): * Go の `regexp.ReplaceAllString` がこれらの予期しない出力を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。