Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 15703] ファイルの概要

このコミットは、Go言語の標準ライブラリであるregexpパッケージのドキュメント改善に関するものです。具体的には、正規表現における「submatch(サブマッチ)」という用語が「capturing group(キャプチャリンググループ)」としても知られていることを明記し、正規表現の構文がregexp/syntaxパッケージで定義されていることを強調しています。これにより、regexpパッケージの利用者がより正確な理解を得られるよう、ドキュメントの明確性を向上させています。

コミット

commit 1b3c969ac36221dc171b0b3f169237fa1507b1e6
Author: Rob Pike <r@golang.org>
Date:   Mon Mar 11 16:23:06 2013 -0700

    regexp: identify that submatch is also known as capturing group
    Mention the syntax is defined by the regexp/syntax package.
    Fixes #3953.
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/7702044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/1b3c969ac36221dc171b0b3f169237fa1507b1e6

元コミット内容

このコミットの目的は、regexpパッケージのドキュメントを改善し、以下の2点を明確にすることです。

  1. submatch(サブマッチ)がcapturing group(キャプチャリンググループ)としても知られていることを明記する。 正規表現の文脈において、「サブマッチ」と「キャプチャリンググループ」は同じ概念を指すことが多く、特に他のプログラミング言語や正規表現エンジンに慣れている開発者にとっては、「キャプチャリンググループ」という用語の方が馴染み深い場合があります。このコミットは、両方の用語を併記することで、利用者の理解を助け、混乱を避けることを意図しています。

  2. 正規表現の構文がregexp/syntaxパッケージで定義されていることを言及する。 regexpパッケージは正規表現のエンジンを提供しますが、その構文の詳細な定義はregexp/syntaxパッケージにあります。このコミットは、regexpパッケージのドキュメントからregexp/syntaxパッケージへの参照を追加することで、利用者が正規表現の構文規則についてより詳細な情報を得られるように誘導しています。

また、この変更はGoのIssue #3953を修正するものです。

変更の背景

この変更の背景には、Go言語のregexpパッケージのドキュメントが、正規表現の概念に不慣れなユーザーや、他の言語の正規表現エンジンに慣れているユーザーにとって、必ずしも十分に明確ではなかったという課題がありました。

特に、「submatch」という用語はGoのregexpパッケージで使われていますが、Perl、Python、Javaなどの多くのプログラミング言語では「capturing group」という用語が一般的です。この用語の不一致が、Goのregexpパッケージを使い始める開発者にとって混乱の原因となる可能性がありました。このコミットは、両方の用語を併記することで、この混乱を解消し、より広範な開発者コミュニティにとって理解しやすいドキュメントを目指しています。

また、正規表現の構文に関する詳細な情報はregexp/syntaxパッケージに集約されていますが、regexpパッケージのトップレベルのドキュメントからその情報源への明確なリンクが不足していました。このコミットは、godoc regexp/syntaxコマンドを実行することで構文の概要を確認できることを明記することで、利用者が正規表現の構文規則を簡単に参照できるようにしています。

これらの変更は、Go言語のドキュメント全体の一貫性とユーザビリティを向上させるという、より大きな目標の一部と見なすことができます。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

1. 正規表現 (Regular Expression)

正規表現は、文字列のパターンを記述するための強力なツールです。特定の文字列の検索、置換、抽出などに広く利用されます。正規表現は、リテラル文字と特殊文字(メタ文字)の組み合わせで構成され、複雑なパターンを表現できます。

2. Go言語の regexp パッケージ

Go言語の標準ライブラリには、正規表現を扱うためのregexpパッケージが用意されています。このパッケージは、Googleが開発したRE2正規表現エンジンに基づいています。RE2は、線形時間でのマッチングを保証し、バックトラッキングによる指数関数的な遅延を防ぐことを特徴としています。

regexpパッケージの主な機能には、正規表現のコンパイル、文字列とのマッチング、マッチした部分文字列の抽出などがあります。

3. Submatch (サブマッチ) と Capturing Group (キャプチャリンググループ)

正規表現において、括弧 () を使用してパターンの一部を囲むと、その囲まれた部分が「グループ」として扱われます。このグループがマッチした文字列の部分を「キャプチャリンググループ」と呼びます。Go言語のregexpパッケージでは、これを「submatch」と呼んでいます。

  • キャプチャリンググループ (Capturing Group): 正規表現内で括弧 () で囲まれた部分パターンがマッチした文字列のこと。これらのグループは、通常、左から右へ、開き括弧の順に番号が振られます(0番目は常に正規表現全体のマッチ)。
  • サブマッチ (Submatch): Go言語のregexpパッケージにおけるキャプチャリンググループの呼称。FindStringSubmatchなどのメソッドで取得できる結果は、このサブマッチのリストです。

例えば、正規表現 (foo)(bar) が文字列 foobar にマッチした場合、以下のサブマッチ(キャプチャリンググループ)が得られます。

  • サブマッチ 0: foobar (正規表現全体)
  • サブマッチ 1: foo (最初のキャプチャリンググループ)
  • サブマッチ 2: bar (2番目のキャプチャリンググループ)

4. regexp/syntax パッケージ

Go言語のregexpパッケージは、正規表現の構文解析とコンパイルを内部的にregexp/syntaxパッケージに依存しています。regexp/syntaxパッケージは、Goの正規表現がサポートする具体的な構文要素(文字クラス、量指定子、グループ化など)を定義しています。このパッケージのドキュメントは、Goの正規表現の構文に関する最も権威ある情報源です。

5. godoc コマンド

godocは、Go言語のパッケージドキュメントを表示するためのコマンドラインツールです。godoc <package_path>と実行することで、指定されたパッケージのドキュメントをターミナルに表示したり、Webサーバーとして起動してブラウザで閲覧したりできます。

技術的詳細

このコミットの技術的詳細は、主にGo言語のドキュメントコメントの変更に集約されます。

  1. src/pkg/regexp/regexp.go の変更:

    • regexpパッケージのトップレベルのドキュメントコメントにおいて、正規表現の構文に関する説明に、godoc regexp/syntaxコマンドを実行することで構文の概要を確認できる旨の記述が追加されました。これは、ユーザーが正規表現の構文の詳細を知りたい場合に、適切な情報源へ誘導するためのものです。
    • Submatchという用語の説明箇所で、「parenthesized subexpressions (also known as capturing groups)」という表現が追加されました。これにより、「submatch」が「capturing group」と同じ概念であることを明示し、他の言語の正規表現に慣れた開発者にとっての理解を促進します。
  2. src/pkg/regexp/syntax/doc.go の変更:

    • regexp/syntaxパッケージのドキュメントコメントにおいて、グループ化のセクションで、numbered capturing groupnamed & numbered capturing groupnon-capturing group のそれぞれに「(submatch)」という補足が追加されました。これは、regexpパッケージで使われる「submatch」という用語が、regexp/syntaxパッケージで定義される「capturing group」の概念と直接的に関連していることを明確にするものです。

これらの変更は、コードの振る舞いを変更するものではなく、あくまでドキュメントの明確性と正確性を向上させることを目的としています。Goのドキュメントは、godocツールによって自動生成されるため、ソースコード内のコメントを修正することが、そのまま公開されるドキュメントの修正に繋がります。

コアとなるコードの変更箇所

src/pkg/regexp/regexp.go

--- a/src/pkg/regexp/regexp.go
+++ b/src/pkg/regexp/regexp.go
@@ -8,6 +8,8 @@
 // general syntax used by Perl, Python, and other languages.
 // More precisely, it is the syntax accepted by RE2 and described at
 // http://code.google.com/p/re2/wiki/Syntax, except for \C.
+// For an overview of the syntax, run
+//   godoc regexp/syntax
 //
 // All characters are UTF-8-encoded code points.
 //
@@ -27,11 +29,11 @@
 // of bytes; return values are adjusted as appropriate.\n //\n // If 'Submatch' is present, the return value is a slice identifying the\n-// successive submatches of the expression.  Submatches are matches of\n-// parenthesized subexpressions within the regular expression, numbered from\n-// left to right in order of opening parenthesis.  Submatch 0 is the match of\n-// the entire expression, submatch 1 the match of the first parenthesized\n-// subexpression, and so on.\n+// successive submatches of the expression. Submatches are matches of\n+// parenthesized subexpressions (also known as capturing groups) within the\n+// regular expression, numbered from left to right in order of opening\n+// parenthesis. Submatch 0 is the match of the entire expression, submatch 1\n+// the match of the first parenthesized subexpression, and so on.\n //\n // If 'Index' is present, matches and submatches are identified by byte index\n // pairs within the input string: result[2*n:2*n+1] identifies the indexes of

src/pkg/regexp/syntax/doc.go

--- a/src/pkg/regexp/syntax/doc.go
+++ b/src/pkg/regexp/syntax/doc.go
@@ -47,9 +47,9 @@ Repetitions:\n   x{n}?          exactly n x\n \n Grouping:\n-  (re)           numbered capturing group\n-  (?P<name>re)   named & numbered capturing group\n-  (?:re)         non-capturing group\n+  (re)           numbered capturing group (submatch)\n+  (?P<name>re)   named & numbered capturing group (submatch)\n+  (?:re)         non-capturing group (submatch)\n   (?flags)       set flags within current group; non-capturing\n   (?flags:re)    set flags during re; non-capturing\n \n```

## コアとなるコードの解説

### `src/pkg/regexp/regexp.go` の変更点

1.  **`godoc regexp/syntax` の追加**:
    ```go
    // For an overview of the syntax, run
    //   godoc regexp/syntax
    ```
    この行は、`regexp`パッケージのドキュメントの冒頭部分に追加されました。これにより、`regexp`パッケージのユーザーが正規表現の構文についてより詳細な情報を求めた際に、`regexp/syntax`パッケージのドキュメントを参照するように明確に指示しています。`godoc`コマンドはGoのドキュメントツールであり、このコマンドを実行することで、`regexp/syntax`パッケージが提供する正規表現の構文規則に関する詳細な説明を直接参照できます。これは、ドキュメントのナビゲーションと情報発見性を向上させるための重要な変更です。

2.  **`submatch` と `capturing groups` の併記**:
    ```go
    // successive submatches of the expression. Submatches are matches of
    // parenthesized subexpressions (also known as capturing groups) within the
    // regular expression, numbered from left to right in order of opening
    // parenthesis. Submatch 0 is the match of the entire expression, submatch 1
    // the match of the first parenthesized subexpression, and so on.
    ```
    以前のドキュメントでは「submatches」という用語のみが使用されていましたが、この変更により「(also known as capturing groups)」という補足が追加されました。これは、正規表現の文脈で広く使われている「capturing groups」という用語を導入することで、他のプログラミング言語(Perl, Pythonなど)の正規表現に慣れている開発者にとって、Goの`regexp`パッケージの「submatch」が何を指すのかを直感的に理解できるようにするための配慮です。これにより、用語のギャップが埋まり、ドキュメントの普遍性が向上します。

### `src/pkg/regexp/syntax/doc.go` の変更点

1.  **グループ化の定義に `(submatch)` の追加**:
    ```go
    //   (re)           numbered capturing group (submatch)
    //   (?P<name>re)   named & numbered capturing group (submatch)
    //   (?:re)         non-capturing group (submatch)
    ```
    `regexp/syntax`パッケージのドキュメントは、Goの正規表現がサポートする具体的な構文要素を定義しています。この変更では、`numbered capturing group`、`named & numbered capturing group`、`non-capturing group` のそれぞれの説明に「(submatch)」という補足が追加されました。これは、`regexp`パッケージで「submatch」として扱われる概念が、`regexp/syntax`パッケージで定義されているこれらの「capturing group」のタイプと直接的に対応していることを明確に示しています。これにより、両パッケージ間の用語の整合性が高まり、ユーザーが正規表現の構文と結果の解釈をより正確に結びつけられるようになります。

これらの変更は、Goのドキュメントの品質とユーザーエクスペリエンスを向上させるための、細かではあるが重要な改善です。

## 関連リンク

*   Go Issue #3953: [https://github.com/golang/go/issues/3953](https://github.com/golang/go/issues/3953)
*   Go CL 7702044: [https://golang.org/cl/7702044](https://golang.org/cl/7702044)
*   RE2 Syntax: [http://code.google.com/p/re2/wiki/Syntax](http://code.google.com/p/re2/wiki/Syntax) (RE2プロジェクトはGoogle CodeからGitHubへ移行しているため、現在のRE2の公式リポジトリやドキュメントを参照することが推奨されます。)

## 参考にした情報源リンク

*   Go言語 `regexp` パッケージ公式ドキュメント: [https://pkg.go.dev/regexp](https://pkg.go.dev/regexp)
*   Go言語 `regexp/syntax` パッケージ公式ドキュメント: [https://pkg.go.dev/regexp/syntax](https://pkg.go.dev/regexp/syntax)
*   正規表現のキャプチャリンググループに関する一般的な情報源 (例: Wikipedia, MDN Web Docsなど)
    *   MDN Web Docs - 正規表現: [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions) (JavaScriptの例ですが、キャプチャリンググループの概念は共通です)
    *   Wikipedia - 正規表現: [https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)