Skip to main content

GitHub Code Search の構文について

特殊なコード修飾子、正規表現、ブール演算を使用して、必要な結果の検索クエリを作成できます。

コード検索のクエリ構造について

この記事の検索構文は、GitHub コード検索を使用したコードの検索にのみ適用されます。 イシュー、ユーザー、ディスカッションなど、コード以外のコンテンツを検索するための構文と修飾子は、コード検索用の構文とは異なる点に注意してください。 コード以外の検索の詳細については、「GitHub での検索について」と「GitHub 上で検索する」を参照してください。

検索クエリは、検索したいテキストと、検索を絞り込む修飾子で構成される検索用語で構成されます。

修飾子のないただの用語は、ファイルの内容またはファイルのパスのいずれかと一致します。

たとえば、次のクエリがあります。

http-push

上記のクエリは、用語 http-push が含まれていなくても、 ファイル docs/http-push.txt と一致します。 用語 http-push が含まれている場合は、example.txt というファイルとも一致します。

複数の用語を空白で区切って入力して、両方の用語を満たすドキュメントを検索できます。

たとえば、次のクエリがあります。

sparse index

検索結果には、その順序を問わず sparseindex の両方の用語を含むすべてのドキュメントが含まれます。 たとえば、SparseIndexVector を含むファイル、フレーズ index for sparse trees を含むファイル、さらには用語 sparse を含む index.txt というファイルにも一致します。

空白で区切られた複数の用語の検索は、検索 hello AND world と同じです。 hello OR world などの他のブール演算もサポートされています。 ブール演算について詳しくは、「ブール演算の使用」を参照してください。

コード検索では、空白を含めた正確な文字列の検索もサポートされています。 詳しくは、「完全一致のクエリ」を参照してください。

repo:language:path: などの特殊な修飾子を使用して、コード検索を絞り込むことができます。 コード検索で使用できる修飾子について詳しくは、「修飾子の使用」を参照してください。

また、式をスラッシュで囲むことで、検索で正規表現を使用することもできます。 正規表現の使用について詳しくは、「正規表現の使用」を参照してください。

完全一致のクエリ

空白を含む正確な文字列を検索するには、文字列を引用符で囲みます。 次に例を示します。

"sparse index"

次のように、引用符で囲まれた文字列を修飾子で使用することもできます。

path:git language:"protocol buffers"

引用符とバックスラッシュの検索

引用符を含むコードを検索するには、バックスラッシュを使用して引用符をエスケープします。 たとえば、正確な文字列 name = "tensorflow" を見つけるには、次のように検索します。

"name = \"tensorflow\""

バックスラッシュ \ を含むコードを検索するには、バックスラッシュを 2 回使用します (\\)。

2 つのエスケープ シーケンス \\\" は、引用符の外側でも使用できます。 ただし、他のエスケープ シーケンスは認識されません。 " または \ が後ろにないバックスラッシュは、検索にそのまま表示されます。

正規表現では、改行文字との一致 (\n) などの、他のエスケープ シーケンスがサポートされています。 「正規表現の使用」を参照してください。

ブール演算の使用

コード検索では、ブール式がサポートされています。 演算子 ANDOR、および NOT を使用して、検索用語を組み合わせることができます。

既定では、隣接する用語を空白で区切ることは、演算子 AND を使用することと同じです。 たとえば、検索クエリ sparse indexsparse AND index と同じです。つまり、検索結果には、その順序を問わず sparseindex の両方の用語を含むすべてのドキュメントが含まれます。

どちらか一方の用語を含むドキュメントを検索するには、OR 演算子を使用します。 たとえば、次のクエリは、sparse または index のどちらかを含むドキュメントと一致します。

sparse OR index

検索結果からファイルを除外するには、NOT 演算子を使用します。 たとえば、__testing__ ディレクトリ内のファイルを除外するには、次のように検索します。

"fatal error" NOT path:__testing__

かっこを使用して、より複雑なブール式を表すことができます。 次に例を示します。

(language:ruby OR language:python) AND NOT path:"/tests/"

修飾子の使用

特殊なキーワードを使用して、検索を修飾できます。

リポジトリ修飾子

リポジトリを検索するには、repo: 修飾子を使用します。 所有者を含む完全なリポジトリ名を指定する必要があります。 次に例を示します。

repo:github-linguist/linguist

リポジトリのセット内で検索するには、複数の repo: 修飾子をブール演算子 OR と組み合わせます。 たとえば次のような点です。

repo:github-linguist/linguist OR repo:tree-sitter/tree-sitter

注: コード検索では、現在、リポジトリ名の正規表現や部分一致はサポートされていないため、repo: 修飾子を機能させるには、リポジトリ名全体 (ユーザー プレフィックスを含む) を入力する必要があります。

Organization とユーザーの修飾子

Organization 内のファイルを検索するには org: 修飾子を使用します。 次に例を示します。

org:github

個人用アカウント内のファイルを検索するには user: 修飾子を使用します。 たとえば次のような点です。

user:octocat

注: コード検索では、現在、Organization やユーザー名の正規表現や部分一致はサポートされていないため、修飾子を機能させるには、Organization やユーザー名全体を入力する必要があります。

言語修飾子

特定の言語に絞り込むには、language: 修飾子を使用します。 次に例を示します。

language:ruby OR language:cpp OR language:csharp

サポートされている言語名の完全な一覧については、github-linguist/linguistlanguages.yaml を参照してください。 希望の言語が一覧にない場合は、追加の pull request を開くことができます。

パス修飾子

ファイル パス内で検索するには、path: 修飾子を使用します。 これは、ファイル パス内のいずれかの場所にその用語を含むファイルと一致します。 たとえば、パス内に用語 unit_tests を含むファイルを検索するには、次を使用します。

path:unit_tests

上記のクエリは、src/unit_tests/my_test.pysrc/docs/unit_tests.md の両方と一致します。両方ともパスのどこかに unit_test が含まれているからです。

特定のファイル名 (そして、パスの一部ではない) のみと一致させるには、正規表現を使用します。

path:/(^|\/)README\.md$/

正規表現では . は特別な意味を持つため、ファイル名内の . はエスケープされることに注意してください。 正規表現の使用について詳しくは、「正規表現の使用」を参照してください。


path: 修飾子では、いくつかの制限付き glob 式を使用することもできます。

たとえば、拡張子 txt のファイルを検索するには、次を使用できます。

path:*.txt

`src` ディレクトリ内の JavaScript ファイルを検索するには、次を使用できます。
path:src/*.js
  • 既定では、glob 式はパスの先頭に固定されないため、上記の式は app/src/main.js のようなパスとも一致します。 ただし、式の前に / を付けると、それが先頭に固定されます。 次に例を示します。

    path:/src/*.js
    
  • */ 文字と一致しないため、上記の例では、すべての結果が src ディレクトリの直接の子孫になります。 サブディレクトリ内で一致し、結果に /src/app/testing/utils/example.js のような深く入れ子になったファイルが含まれるようにするには、** を使用します。 次に例を示します。

    path:/src/**/*.js
    

? グローバル文字を使用することもできます。 たとえば、パス file.aac または file.abc と一致させるには、次を使用できます。

path:*.a?c

`*` や `?` などの特殊文字を含むファイル名を検索するには、単に引用符で囲まれた文字列を使用します。
path:"file?"

glob 式は引用符で囲まれた文字列に対して無効になっているため、上記のクエリはリテラル文字列 file? を含むパスにのみ一致します。

シンボル修飾子

symbol: 修飾子を使用して、コード内の関数やクラス定義などのシンボル定義を検索できます。 シンボル検索は、オープンソースの Tree-sitter パーサー エコシステムを使用したコードの解析に基づいているため、追加の設定やビルド ツールの統合は必要ありません。

たとえば、WithContext というシンボルを検索するには:

language:go symbol:WithContext

一部の言語では、プレフィックス (クラス名のプレフィックスなど) を使用してシンボルを検索できます。 たとえば、構造体 Maint のメソッド deleteRows の場合、Go を使用していれば symbol:Maint.deleteRows、Rust では symbol:Maint::deleteRows を検索できます。

シンボル修飾子で正規表現を使用することもできます。 たとえば、次のクエリでは、Rust で String 型にユーザーが実装した変換が見つかります。

language:rust symbol:/^String::to_.*/

この修飾子は定義のみを検索し、参照は検索しないこと、また、すべてのシンボル型または言語がまだ完全にサポートされているわけではないことに注意してください。 シンボル抽出は、次の言語でサポートされています。

  • C#
  • Python
  • Go
  • Java
  • JavaScript
  • TypeScript
  • PHP
  • プロトコル バッファー
  • Ruby
  • Rust

ただし、その他の言語のサポートも追加するよう取り組んでいます。 この取り組みに貢献したい場合は、シンボル検索の基になっているオープンソースの Tree-sitter パーサー エコシステムでご希望の言語のサポートを追加できます。

Content 修飾子

既定では、ただの用語はパスとファイルの内容の両方を検索します。 ファイル パスではなく、ファイルの内容と厳密に一致するように検索を制限するには、content: 修飾子を使用します。 次に例を示します。

content:README.md

このクエリは、README.md いうファイルと一致するのではなく、用語 README.md を含むファイルにのみ一致します。

Is 修飾子

リポジトリのプロパティに基づいてフィルター処理するには、is: 修飾子を使用できます。 is: では、次の値がサポートされています。

  • archived: 検索対象をアーカイブされたリポジトリに制限します。
  • fork: 検索対象をフォークされたリポジトリに制限します。
  • vendored: 検索対象をベンダーとして検出されたコンテンツに制限します。
  • generated: 検索対象を生成済みとして検出されたコンテンツに制限します。

次に例を示します。

path:/^MIT.txt$/ is:archived

is: 修飾子は NOT 演算子で反転させることができます。 アーカイブされていないリポジトリを検索するには、次を検索します。

log4j NOT is:archived

結果からフォークを除外するには、次を検索します。

log4j NOT is:fork

正規表現の使用

コード検索では、コード内のパターンを検索するための正規表現がサポートされています。 正規表現は、正規表現をスラッシュで囲むことで、ただの検索用語だけでなく多くの修飾子内でも使用できます。

たとえば、正規表現 sparse.*index を検索するには、次を使用します。

/sparse.*index/

正規表現内のスラッシュはエスケープする必要があることに注意してください。 たとえば、App/src ディレクトリ内のファイルを検索するには、次を使用します。

/^App\/src\//

正規表現では、\n は改行文字を表し、\t はタブを表し、\x{hhhh} を使用して任意の Unicode 文字をエスケープできます。 つまり、正規表現を使用すると、検索バーに入力できない文字を含む正確な文字列を検索できます。

最も一般的な正規表現機能は、コード検索で機能します。 ただし、「ルックアラウンド」アサーションはサポートされていません。

検索語句の分離

検索語句、完全一致文字列、正規表現、修飾子、かっこ、ブール値のキーワード (ANDORNOT) などの、検索のすべての部分をスペースで区切る必要があります。 1 つの例外は、( ) かっこ内の項目をかっこから区切る必要がない点です。

検索に、スペースで区切られていない複数のコンポーネント、または上記の規則に従っていない他のテキストが含まれている場合、コード検索では、意味を推測しようとします。 多くの場合、クエリのそのコンポーネントを、完全一致テキストの検索として扱うことにフォールバックします。 たとえば、以下のクエリ:

printf("hello world\n");

コード検索では、かっこと引用符を特殊文字として解釈することを放棄し、代わりにその完全一致コードを含むファイルを検索します。

コード検索の推測が間違っている場合は、引用符とスペースを使用して意味を明確にすることで、必要な検索結果を常に取得できます。