# GitHubのコード検索構文を理解する

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

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

この記事の検索構文は、GitHub コード検索を使用したコードの検索にのみ適用されます。 データの再利用可能検索.コード外検索に関する説明 %}

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

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

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

```text
http-push
```

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

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

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

```text
sparse index
```

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

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

コード検索では、空白を含めた正確な文字列の検索もサポートされています。 詳細については、「[完全一致のクエリ](#query-for-an-exact-match)」を参照してください。

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

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

## 完全一致のクエリ

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

```text
"sparse index"
```

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

```text
path:git language:"protocol buffers"
```

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

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

```text
"name = \"tensorflow\""
```

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

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

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

## ブール演算の使用

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

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

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

```text
sparse OR index
```

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

```text
"fatal error" NOT path:__testing__
```

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

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

## 修飾子の使用

特殊なキーワードを使用して、検索を修飾できます。
\*
[リポジトリ修飾子](#repository-qualifier)
\*
[組織とユーザーの修飾子](#organization-and-user-qualifiers)
\*
[エンタープライズクオリファイア](#enterprise-qualifier)
\*
[言語修飾子](#language-qualifier)
\*
[ライセンス修飾子](#license-qualifier)
\*
[パス修飾子](#path-qualifier)
\*
[シンボル修飾子](#symbol-qualifier)
\*
[コンテンツ修飾子](#content-qualifier)
\*
[Is 修飾子](#is-qualifier)

### リポジトリ修飾子

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

```text
repo:github-linguist/linguist
```

リポジトリのセット内で検索するには、複数の `repo:` 修飾子をブール演算子 `OR` と組み合わせます。 次に例を示します。

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

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

### 組織とユーザーの修飾子

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

```text
org:github
```

個人用アカウント内のファイルを検索するには `user:` 修飾子を使用します。 次に例を示します。

```text
user:octocat
```

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

### エンタープライズクオリファイア

企業内のファイルを検索するには、 `enterprise:` 修飾子を使用します。 次に例を示します。

```text
enterprise:octocorp
```

これにより、 `octocorp` 企業内の組織が所有するリポジトリが検索されます。 ユーザー所有のリポジトリは含まれません。

### 言語修飾子

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

```text
language:ruby OR language:cpp OR language:csharp
```

サポートされている言語名の完全な一覧については、[github-linguist/linguist](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml) の [languages.yaml](https://github.com/github-linguist/linguist) を参照してください。 希望の言語が一覧にない場合は、追加の pull request を開くことができます。

### ライセンス修飾子

ライセンスまたはライセンス ファミリに基づいてリポジトリをフィルター処理するには、 `license:` 修飾子と正確なライセンス キーワード ( `Apache-2.0`、 `CC`、 `MIT`など) を使用します。

```text
license:MIT
```

ライセンス キーワードの一覧については、 [リポジトリのライセンス](/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository#searching-github-by-license-type) を参照してください。

### パス修飾子

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

```text
path:unit_tests
```

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

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

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

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

<br>

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

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

```text
path:*.txt
```

<br>

```
          `src` ディレクトリ内の JavaScript ファイルを検索するには、次を使用できます。
```

```text
path:src/*.js
```

* 既定では、glob 式はパスの先頭に固定されないため、上記の式は `app/src/main.js` のようなパスとも一致します。 ただし、式の前に `/` を付けると、それが先頭に固定されます。 次に例を示します。

  ```text
  path:/src/*.js
  ```

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

  ```text
  path:/src/**/*.js
  ```

<br>

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

```text
path:*.a?c
```

<br>

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

```text
path:"file?"
```

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

### シンボル修飾子

```
          `symbol:` 修飾子を使用して、コード内の関数やクラス定義などのシンボル定義を検索できます。 シンボル検索は、open source [Tree-sitter](https://github.com/tree-sitter) パーサー エコシステムを使用したコードの解析に基づいているため、追加のセットアップやビルド ツールの統合は必要ありません。
```

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

```text
language:go symbol:WithContext
```

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

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

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

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

* Bash
* C
* C#
* C++
* CodeQL
* Elixir
* Go
* JSX
* Java
* JavaScript
* Lua
* PHP
* プロトコル バッファー
* Python
* R
* Ruby
* Rust
* Scala
* Starlark
* Swift
* TypeScript

ただし、その他の言語のサポートも追加するよう取り組んでいます。 この作業に貢献したい場合は、シンボル検索の基になる open source [Tree-sitter](https://github.com/tree-sitter) パーサー エコシステムで言語のサポートを追加できます。

### コンテンツ修飾子

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

```text
content:README.md
```

このクエリは、`README.md` を含むファイルにのみ一致し、`README.md` という名前のファイルとは一致しません。

### Is 修飾子

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

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

次に例を示します。

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

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

```text
log4j NOT is:archived
```

結果からフォークを除外するには、次を検索してください。

```text
log4j NOT is:fork
```

## 正規表現の使用

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

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

```text
/sparse.*index/
```

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

```text
/^App\/src\//
```

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

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

## 検索語句の分離

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

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

```text
printf("hello world\n");
```

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

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

## 大文字小文字の区別

既定のコード検索は大文字と小文字が区別されず、結果には大文字と小文字の両方が含まれます。 大文字と小文字の区別をオフにした状態で正規表現を使用すると、大文字と小文字を区別して検索することができます。 たとえば、文字列 "True" を検索するには、次のように使います。

```text
/(?-i)True/
```