Go の ReplaceAllString: なぜドル記号はこれほど奇妙な動作をするのでしょうか?

Mary-Kate Olsen
リリース: 2024-10-28 08:51:02
オリジナル
424 人が閲覧しました

 Go's ReplaceAllString: Why Do Dollar Signs Behave So Strangely?

Go の ReplaceAllString 関数: その構文と出力の詳細

Go の regexp パッケージを探索しているときに、ReplaceAllString 関数に遭遇して熟考したことがあるかもしれません。その謎の出力。この記事は、特定の文字列に適用したときに生成される興味深い結果に焦点を当て、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-" ですが、これは、出現するすべての "a(x*)b" を "T. 」ただし、残りの出力は不可解な場合があります:

--xx-
---
-W-xxW-
ログイン後にコピー
ログイン後にコピー

ReplaceAllString 関数の解明

これらの出力の背後にある謎を解明するには、ReplaceAllString 関数の構文を詳しく調べる必要があります。動作:

<code class="go">func (re *Regexp) ReplaceAllString(src, repl string) string</code>
ログイン後にコピー

この関数は 2 つの引数を取ります:

  • src: 分析される入力文字列
  • repl: 使用する置換パターン

置換パターンにおける $ 記号の重要性

出力を理解する鍵は以下を理解することにあります関数が置換文字列内のドル記号 ($) をどのように解釈するか。 Go のドキュメントによると、「$ 記号は Expand のように解釈されます。」

Expand 関数とその影響

ReplaceAllString で参照される Expand 関数

  • $name: n 番目のキャプチャ グループによってキャプチャされたグループとして解釈されます。
  • ${name}: 名前付きキャプチャ「name」によってキャプチャされたグループとして解釈されます。
  • 指定されたグループが存在しないか、照合中に初期化されない場合は、空の文字列が使用されます。

出力の分析

これらのガイドラインに基づいて、出力を分析しましょう:

  • 出力 2: 「$1」は、最初のキャプチャグループ「(x)」を指します。 "x" はキャプチャされなかったため、空の文字列に置き換えられ、"--xx-" となります。
  • 出力 3: "$1W" は、 「1W」というグループ。ただし、その名前の名前付きキャプチャが存在しないため、空の文字列が使用され、「---.」が生成されます。
  • 出力 4: "${1}W" は本質的に同じですただし、中括弧が置換構文を曖昧にしている点を除きます。いずれにしても、空の文字列が置換され、「-W-xxW-」が生成されます。

名前付きキャプチャの力

出力の一貫性を確保するには、「?P...」で示される名前付きキャプチャを利用できます。最初のキャプチャ グループの名前を変更することで、「$1」と「${name}」が同じキャプチャされたテキストを参照していることを保証できます。

改訂されたコードと予想される出力

<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>
ログイン後にコピー
ログイン後にコピー

期待される出力:

--xx-
---
-W-xxW-
ログイン後にコピー
ログイン後にコピー

結論

ReplaceAllString の構文のニュアンスと置換パターンにおける $ 記号の役割を理解することで、 Go の正規表現パッケージに対する感謝の気持ちが高まりました。この知識により、複雑な文字列操作タスクにその力を効果的に活用できるようになります。

以上がGo の ReplaceAllString: なぜドル記号はこれほど奇妙な動作をするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!